使用C#枚举能搜索到的WiFi列表

最近在一个项目中需要能自动获取到能搜索到的WiFi列表,经过在网上查找资料,找到一个类,效果比较好,可以根据自己的需要,更改使用。

  • 源码
   class wifi
    {
        /// <summary>
        /// 打开一个wifi句柄
        /// </summary>
        /// <param name="dwClientVersion">版本号</param>
        /// <param name="pReserved">保留</param>
        /// <param name="pdwNegotiatedVersion">支持的最高版本(输出)</param>
        /// <param name="ClientHandle">句柄(要得到的)以后的句柄一般都是这个</param>
        /// <returns></returns>
        [DllImport("Wlanapi", EntryPoint = "WlanOpenHandle")]
        public static extern uint WlanOpenHandle(uint dwClientVersion, IntPtr pReserved, [Out] out uint pdwNegotiatedVersion, ref IntPtr ClientHandle);
        /// <summary>
        /// 关闭打开的句柄
        /// </summary>
        /// <param name="hClientHandle">句柄</param>
        /// <param name="pReserved">保留</param>
        /// <returns></returns>
        [DllImport("Wlanapi", EntryPoint = "WlanCloseHandle")]
        public static extern uint WlanCloseHandle([In] IntPtr hClientHandle, IntPtr pReserved);
        /// <summary>
        /// 列举无线网络适配器
        /// </summary>
        /// <param name="hClientHandle">句柄</param>
        /// <param name="pReserved">保留</param>
        /// <param name="ppInterfaceList">数据指针(非托管)</param>
        /// <returns></returns>
        [DllImport("Wlanapi", EntryPoint = "WlanEnumInterfaces")]
        public static extern uint WlanEnumInterfaces([In] IntPtr hClientHandle, IntPtr pReserved, ref IntPtr ppInterfaceList);
        /// <summary>
        /// 释放内存
        /// </summary>
        /// <param name="pMemory">要释放的内存起始地址</param>
        [DllImport("Wlanapi", EntryPoint = "WlanFreeMemory")]
        public static extern void WlanFreeMemory([In] IntPtr pMemory);
        /// <summary>
        /// 获得可见的无线网络
        /// </summary>
        /// <param name="hClientHandle">句柄</param>
        /// <param name="pInterfaceGuid">适配器的guid号</param>
        /// <param name="dwFlags">标志位</param>
        /// <param name="pReserved">保留</param>
        /// <param name="ppAvailableNetworkList">无线网络的内存起始地址(非托管)</param>
        /// <returns></returns>
        [DllImport("Wlanapi", EntryPoint = "WlanGetAvailableNetworkList")]
        public static extern uint WlanGetAvailableNetworkList(IntPtr hClientHandle, ref Guid pInterfaceGuid, uint dwFlags, IntPtr pReserved, ref IntPtr ppAvailableNetworkList);
        /// <summary>
        /// 网络适配器的状态
        /// </summary>
        public enum WLAN_INTERFACE_STATE
        {
            WLAN_INTERFACE_STATE_NOT_READY = 0,
            WLAN_INTERFACE_STATE_CONNECTED = 1,
            WLAN_INTERFACE_STATE_AD_HOC_NETWORK_FORMED =2,
            WLAN_INTERFACE_STATE_DISCONNECTING =3,
            WLAN_INTERFACE_STATE_DISCONNECTED = 4,
            WLAN_INTERFACE_STATE_ASSOCIATING =5,
            WLAN_INTERFACE_STATE_DISCOVERING =6,
            WLAN_INTERFACE_STATE_AUTHENTICATING = 7
        }
        /// <summary>
        /// 一个适配器的信息
        /// </summary>
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct WLAN_INTERFACE_INFO
        {
            ///GUID->_GUID
            public Guid InterfaceGuid;//Guid自动生成代码
            ///WCHAR[256]
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string strInterfaceDescription;
            ///WLAN_INTERFACE_STATE
            public WLAN_INTERFACE_STATE isState;
        }
        /// <summary>
        /// 包含所有适配器
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct WLAN_INTERFACE_INFO_LIST //struct结构
        {
            public Int32 dwNumberOfItems;
            public Int32 dwIndex;
            public WLAN_INTERFACE_INFO[] InterfaceInfo;
            public WLAN_INTERFACE_INFO_LIST(IntPtr pList)
            {
                dwNumberOfItems = Marshal.ReadInt32 (pList,0);
                dwIndex = Marshal.ReadInt32(pList, 4);
                InterfaceInfo = new WLAN_INTERFACE_INFO[dwNumberOfItems];
                for (int i = 0; i < dwNumberOfItems; i++)
                {
                    IntPtr pItemList = new IntPtr(pList.ToInt32() + (i * 532) + 8);
                    WLAN_INTERFACE_INFO wii = new WLAN_INTERFACE_INFO();
                    wii = (WLAN_INTERFACE_INFO)Marshal.PtrToStructure(pItemList, typeof(WLAN_INTERFACE_INFO));
                    InterfaceInfo[i] = wii;
                }
            }
        }
        /// <summary>
        /// 服务器标志(子网络标志号)
        /// </summary>
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
        public struct DOT11_SSID
        {
            public uint uSSIDLength;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string ucSSID;
        }
        /// <summary>
        /// BSS类型
        /// </summary>
        public enum DOT11_BSS_TYPE
        {
            DOT11_BSS_TYPE_INFRASTRUCTURE = 1,
            DOT11_BSS_TYPE_INDEPENDENT =2,
            DOT11_BSS_TYPE_ANY=3
        }
        public enum DOT11_PHY_TYPE
        {
            DOT11_PHY_TYPE_UNKNOWN =1,
            DOT11_PHY_TYPE_ANY,
            DOT11_PHY_TYPE_FHSS,
            DOT11_PHY_TYPE_DSSS,
            DOT11_PHY_TYPE_IRBASEHAND,
            DOT11_PHY_TYPE_OFDM,
            DOT11_PHY_TYPE_HRDSSS,
            DOT11_PHY_TYPE_ERP,
            DOT11_PHY_TYPE_HT,
            DOT11_PHY_TYPE_IHV_START,
            DOT11_PHY_TYPE_IHV_END
        }
        public enum DOT11_AUTH_ALGORITHM
        {
            DOT11_AUTH_ALGO_80211_OPEN = 1,
            DOT11_AUTH_ALGO_80211_SHARED_KEY = 2,
            DOT11_AUTH_ALGO_WPA = 3,
            DOT11_AUTH_ALGO_WPA_PSK=4,
            DOT11_AUTH_ALGO_WPA_NONE=5,
            DOT11_AUTH_ALOG_RSNA = 6,
            DOT11_AUTH_ALOG_RSNA_PSK = 7,
            DOT11_AUTH_ALOG_IHV_START = -2147483648,
            DOT11_AUTH_ALOG_IHV_END = -1
        }
        public enum DOT11_CIPER_ALGORITHM
        {
            DOT11_CIPER_ALGO_NONE = 0,
            DOT11_CIPER_ALGO_WEP40 = 1,
            DOT11_CIPER_ALGO_TKIP =2,
            DOT11_CIPER_ALGO_CCMP = 4,
            DOT11_CIPER_ALGO_WEP104 = 5,
            DOT11_CIPER_ALGO_WPA_USE_GROUP = 256,
            DOT11_CIPER_ALGO_RSN_USE_GROUP = 256,
            DOT11_CIPER_ALGO_WEP = 257,
            DOT11_CIPER_ALGO_IHV_START=-2147483648,
            DOT11_CIPER_ALGO_IHV_END = -1
        }
        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        public struct WLAN_AVAILABLE_NETWORK
        {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string strProfileName;
            public DOT11_SSID dot11Ssid;
            public DOT11_BSS_TYPE dot11BssType;
            public uint uNumberOfBssids;
            public bool bNetworkConnectable;
            public uint wlanNotConnectableReason;
            public uint uNumberOfPhyTypes;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
            public DOT11_PHY_TYPE[] dot11PhyTypes;
            public bool bMorePhyTypes;
            public uint wlanSignalQuality;
            public bool bSecurityEnabled;
            public DOT11_AUTH_ALGORITHM dot11DefaultAuthAlgorithm;
            public DOT11_CIPER_ALGORITHM dot11DefaultCipherAlgorithm;
            public uint dwFlags;
            public uint dwReserved;
        }
        /// <summary>
        /// 
        /// </summary>
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        struct WLAN_AVALABLE_NETWORK_LIST
        {
            internal uint dwNumberOfItems;
            internal uint dwIndex;
            internal WLAN_AVAILABLE_NETWORK[] wlanAvailableNetwork;
            internal WLAN_AVALABLE_NETWORK_LIST(IntPtr ppAvailableNetworkList)
            {
                dwNumberOfItems = (uint)Marshal.ReadInt32(ppAvailableNetworkList);
                dwIndex = (uint)Marshal.ReadInt32(ppAvailableNetworkList, 4);
                wlanAvailableNetwork = new WLAN_AVAILABLE_NETWORK[dwNumberOfItems];
                for (int i = 0; i < dwNumberOfItems; i++)
                {
                    IntPtr pWlanAvailableNetwork = new IntPtr(ppAvailableNetworkList.ToInt32() + i * Marshal.SizeOf(typeof(WLAN_AVAILABLE_NETWORK)) + 8);
                    wlanAvailableNetwork[i] = (WLAN_AVAILABLE_NETWORK)Marshal.PtrToStructure(pWlanAvailableNetwork, typeof(WLAN_AVAILABLE_NETWORK));
                }
            }
        }
        public static  void EnumerateAvailableNetwork()
        {
            uint serviceVersion = 0;
            IntPtr handle = IntPtr.Zero;
            int result;
            result = (int)WlanOpenHandle(2, IntPtr.Zero, out serviceVersion, ref handle);
            Console.WriteLine(result);
            IntPtr ppInterfaceList = IntPtr.Zero;
            WLAN_INTERFACE_INFO_LIST  interfaceList;
            if(WlanEnumInterfaces(handle,IntPtr.Zero,ref ppInterfaceList) == 0)
            {
                interfaceList = new WLAN_INTERFACE_INFO_LIST (ppInterfaceList );
                Console.WriteLine("有{0}个无线网络适配器", interfaceList.dwNumberOfItems);
                Console.WriteLine("Enumerating Wireless Network Adapters...");
                for (int i = 0; i < interfaceList.dwNumberOfItems; i++)
                {
                    Console.WriteLine("{0}", interfaceList.InterfaceInfo[i].strInterfaceDescription);
                    IntPtr ppAvailableNetworkList = new IntPtr();
                    Guid pInterfaceGuid = interfaceList.InterfaceInfo[i].InterfaceGuid;
                    WlanGetAvailableNetworkList (handle,ref pInterfaceGuid ,0x00000002,new IntPtr(),ref ppAvailableNetworkList );
                    WLAN_AVALABLE_NETWORK_LIST wlanAvailableNetworkList = new WLAN_AVALABLE_NETWORK_LIST(ppAvailableNetworkList);
                    WlanFreeMemory(ppAvailableNetworkList);
                    WlanCloseHandle(handle, IntPtr.Zero);
                    for (int j = 0;j <wlanAvailableNetworkList.dwNumberOfItems ;j ++)
                    {
                        WLAN_AVAILABLE_NETWORK network = wlanAvailableNetworkList.wlanAvailableNetwork[j];
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("Available Network:");
                        Console.WriteLine("SSID:" + network.dot11Ssid.ucSSID );
                        Console.WriteLine("StrProfile:" + network.strProfileName);
                        Console.WriteLine("Encrypted:" + network.bSecurityEnabled);
                        Console.WriteLine("Signal Strength:" + network.wlanSignalQuality);
                        Console.WriteLine ("Default Authentication:"+ network.dot11DefaultAuthAlgorithm.ToString ());
                        Console.WriteLine("Default Cipher:" + network.dot11DefaultCipherAlgorithm.ToString());
                        Console.WriteLine();
                    }
                }
            }
            else
            {
               Console.WriteLine(“本机没有发现有无线网络适配器”);
            }
        }
    }
  • 调用
wifi.EnumerateAvailableNetwork() 
  • 遗留问题(待验证)
    在枚举WiFi SSID时,如果有中文名称的SSID,会存在乱码。怀疑时编码所致,可以将编码格式从Unicode更改为UTF8试下。
  [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
   struct WLAN_AVALABLE_NETWORK_LIST
        {
            internal uint dwNumberOfItems;
            internal uint dwIndex;
            internal WLAN_AVAILABLE_NETWORK[] wlanAvailableNetwork;
            internal WLAN_AVALABLE_NETWORK_LIST(IntPtr ppAvailableNetworkList)
            {
                dwNumberOfItems = (uint)Marshal.ReadInt32(ppAvailableNetworkList);
                dwIndex = (uint)Marshal.ReadInt32(ppAvailableNetworkList, 4);
                wlanAvailableNetwork = new WLAN_AVAILABLE_NETWORK[dwNumberOfItems];
                for (int i = 0; i < dwNumberOfItems; i++)
                {
                    IntPtr pWlanAvailableNetwork = new IntPtr(ppAvailableNetworkList.ToInt32() + i * Marshal.SizeOf(typeof(WLAN_AVAILABLE_NETWORK)) + 8);
                    wlanAvailableNetwork[i] = (WLAN_AVAILABLE_NETWORK)Marshal.PtrToStructure(pWlanAvailableNetwork, typeof(WLAN_AVAILABLE_NETWORK));
                }
            }
        }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,135评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,317评论 3 397
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,596评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,481评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,492评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,153评论 1 309
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,737评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,657评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,193评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,276评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,420评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,093评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,783评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,262评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,787评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,427评论 2 359

推荐阅读更多精彩内容

  • 字符是用户可以读写的最小单位。计算机所能支持的字符组成的集合,就叫做字符集。字符集通常以二维表的形式存在。二维表的...
    刘惜有阅读 8,125评论 2 14
  • 字符集和编码简介 在编程中常常可以见到各种字符集和编码,包括ASCII,MBCS,Unicode等字符集。确切的说...
    兰山小亭阅读 8,503评论 0 13
  • 1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理...
    SnowflakeCloud阅读 41,010评论 0 48
  • 觉察日记117 英九的最后一次聚会 最后一次小组聚会的奇异经历?首先是张蕊和小红没有参加,然后是棚云和峻峰中午才来...
    龚玉婷阅读 76评论 0 0
  • 说实话,在此之前我对《鸣梁海战》并没有太深印象,即使它在韩国创下了高票房记录。时隔两年,当我从一篇文章上一掠而过时...
    一直穿高跟鞋的猪阅读 1,246评论 0 3