Vista 无线网络扫描器






4.51/5 (19投票s)
2007年6月22日
2分钟阅读

341235

11664
一个(可以说是)Vista 版的 NetStumbler
引言
我最近买了一台新笔记本,并经常将我所有旧的、最喜欢的实用程序传输到它,这时我发现 NetStumbler 不能在 Vista 上运行。我看到了一些关于使用以下命令行来实现一个简易版本的引用:
netsh wlan show networks mode=bssid
我决定将它放在一个窗口中,这就是我的努力。有关 netsh
的 Microsoft 文档,请参阅 Windows Netsh。
代码
Form 上的一个计时器每两秒调用一次 Scan()
函数。 Scan()
函数首先使用 Process()
类通过命令行参数执行 netsh
命令
Process proc = new Process();
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.FileName = "netsh";
proc.StartInfo.Arguments = "wlan show networks mode=bssid";
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
然后,输出逐行解析,以构建当前活动的网络的数组。 这是在 listView
中使用 MAC 地址作为项目文本,并为其余信息使用子项目来呈现的。 使用以下方法查找尚未在 listView
中的已发现网络:
ListViewItem SearchItem = new ListViewItem();
SearchItem = listView1.FindItemWithText(Networks[i, 0]);
if (SearchItem == null)
{
// New discovery - add it to the list
listView
中已有的任何网络都会被更新。 信号电平图标由 listView
上的位图生成
int SignalInt = Convert.ToInt32(Networks[i, 3].TrimEnd(' ').TrimEnd('%'));
if (SignalInt > 50) listView1.Items[listView1.Items.Count-1].ImageIndex = 0;
else . . .
彩色图标代表信号电平,如下所示:
大于 50% 的信号电平
41% 到 50% 的信号电平
31% 到 40% 的信号电平
21% 到 30% 的信号电平
1% 到 20% 的信号电平
无信号
关注点
listView
控件的一个烦恼是闪烁。 每次 Update()
或 Refresh()
都会导致整个列表被清除并重写。 我使用了 Don Koster 的提示,并添加了他的 listViewNF
类。 使用这个 listViewNF
类通过仅重绘已更改的区域来停止闪烁。
class ListViewNF : System.Windows.Forms.ListView
{
public ListViewNF()
{
//Activate double buffering
this.SetStyle(ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint, true);
//Enable the OnNotifyMessage event so we get a chance to filter out
// Windows messages before they get to the Form's WndProc
this.SetStyle(ControlStyles.EnableNotifyMessage, true);
}
protected override void OnNotifyMessage(Message m)
{
//Filter out the WM_ERASEBKGND message
if (m.Msg != 0x14)
{
base.OnNotifyMessage(m);
}
}
已知问题
netsh
命令有时更新真实网络状态的速度很慢。 如果网络已连接,则 netsh
显示的信号电平似乎没有更新。 连接状态似乎也会改变已连接网络和其他网络的信号电平。 当关闭已连接的网络时,netsh
(或者可能是驱动程序问题)可能需要超过一分钟才能从输出中删除该网络。 关闭并重新打开无线似乎会强制一个新的信号电平。 此外,有时 netsh
命令似乎会在每次更新时更改信号电平。 一旦进入此模式,它将在主电源上运行时更新每个命令的信号电平,但如果在电池电源上运行则不会! 正常的信号更新间隔似乎是一分钟。 我使用带有英特尔 3945ABG 无线适配器的 Dell 640m 笔记本电脑对此进行了测试。
历史
- 2007 年 6 月 23 日:新文章。
- 2007 年 6 月 24 日:哎呀!位图未包含在演示项目中。 现在已修复。