65.9K
CodeProject 正在变化。 阅读更多。
Home

Vista 无线网络扫描器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.51/5 (19投票s)

2007年6月22日

2分钟阅读

viewsIcon

341235

downloadIcon

11664

一个(可以说是)Vista 版的 NetStumbler

Screenshot - WifiScanner1.gif

引言

我最近买了一台新笔记本,并经常将我所有旧的、最喜欢的实用程序传输到它,这时我发现 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 . . .

彩色图标代表信号电平,如下所示:

Green Dot 大于 50% 的信号电平

Yellow Dot 41% 到 50% 的信号电平

Orange Dot 31% 到 40% 的信号电平

Red Dot 21% 到 30% 的信号电平

Dark Red Dot 1% 到 20% 的信号电平

Grey Dot 无信号

关注点

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 日:哎呀!位图未包含在演示项目中。 现在已修复。
© . All rights reserved.