一台电脑,有时通过有线网连接网络(调制解调器/局域网),如有网卡也可连接wifi。
那么如何获取WLAN是否连接,和相应的信号强度呢?
就以下俩点:
- 获取电脑连网状态
- 获取无线网络的信号强度
获取电脑连网状态
在看下文之前,可以浏览:通过InternetGetConnectedState方法对网络状态的获取
如上InternetGetConnectedState方法介绍中
- dwReversed必须设置为0
- 通过输出值lpdwFlags可以获取当前网络连接的信息,通过拼装对比可以得到当前连接的网络类型,如拨号上网/局域网/无线网等
bool InternetGetConnectedState( out LPDWORD lpdwFlags, int dwReversed);
首先,添加非托管函数并调用,可以获取网络是否联网
//声明外部的函数 [DllImport("winInet.dll ")] private static extern bool InternetGetConnectedState(ref int flag,int dwReserved);
获取无线网络的信号强度
1. 判断当前是否是WLAN网络
微软API表示,不管是否有网,Flag值都是有效的。
1 var isConnectedNetwork = InternetGetConnectedState(ref Flag, 0); 2 var hasWlan = (Flag & INTERNET_CONNECTION_LAN) != 0;
2. 获取WLAN的名称与信号强度
无线网的信息,可以通过第三方开源ManagedWifi来获取。
也可以从我的云盘下载:https://pan.baidu.com/s/1CjSUIMr0DuVqDZrdZCx_mA 密码:2d2o
下载后引用到项目中
值得注意的是,
- WlanClient只在有网卡的系统中能初始化
- WlanInterfacer的GetAvailableNetworkList方法,获取的是附近wifi热点列表,和任务栏下热点列表的顺序无关。
- WlanAvailableNetwork的wlanSignalQuality信号强度,100以内,如要转换成信号格数,需要整除25
- profileName,对已连接的热点profileName显示完整,未连接的热点profileName为empty.
定义枚举值:
暂时只定义了有线网和无线网的状态
1 /// <summary> 2 /// 网络状态 3 /// </summary> 4 public enum NetworkStatus 5 { 6 Internet, 7 InternetWithError, 8 WifiWithError, 9 WifiWithOneBar, 10 WifiWithTwoBars, 11 WifiWithThreeBars, 12 WifiWithFourBars, 13 }
获取网络状态的详细实现
流程:网络是否连接->是否有无线网连接->获取无线网状态(信号强度)->返回网络状态
1 //获取网络状态 2 public static NetworkStatus GetNetworkStatus() 3 { 4 var networkStatus = NetworkStatus.InternetWithError; 5 6 int Flag = 0; 7 var isConnectedNetwork = InternetGetConnectedState(ref Flag, 0); 8 var hasWlan = (Flag & INTERNET_CONNECTION_LAN) != 0; 9 10 if (hasWlan) 11 { 12 var wlanStatus = GetWlanStatus(); 13 if (isConnectedNetwork && wlanStatus == NetworkStatus.WifiWithError) 14 { 15 //如未已连接网络,且无线网连接错误,则返回有线网连接正常状态。 16 networkStatus = NetworkStatus.Internet; 17 } 18 else 19 { 20 networkStatus = wlanStatus; 21 } 22 } 23 else 24 { 25 //返回有线网连接状态 26 networkStatus = isConnectedNetwork ? NetworkStatus.Internet : NetworkStatus.InternetWithError; 27 } 28 return networkStatus; 29 } 31 32 private static NetworkStatus GetWlanStatus() 33 { 34 var wlanStatus = NetworkStatus.WifiWithError; 35 try 36 { 37 WlanClient wlanClient = new WlanClient(); 38 39 foreach (WlanClient.WlanInterface wlanIface in wlanClient.Interfaces) 40 { 41 if (wlanIface.InterfaceState == Wlan.WlanInterfaceState.Connected && wlanIface.CurrentConnection.isState == Wlan.WlanInterfaceState.Connected) 42 { 43 Wlan.WlanAvailableNetwork[] networks = wlanIface.GetAvailableNetworkList(0); 44 foreach (var network in networks) 45 { 46 if (network.profileName == wlanIface.CurrentConnection.profileName 47 && (int)network.flags == (int)(Wlan.WlanAvailableNetworkFlags.Connected | Wlan.WlanAvailableNetworkFlags.HasProfile)) 48 { 49 switch (network.wlanSignalQuality / 25) 50 { 51 case 0: 52 wlanStatus = NetworkStatus.WifiWithOneBar; 53 break; 54 case 1: 55 wlanStatus = NetworkStatus.WifiWithTwoBars; 56 break; 57 case 2: 58 wlanStatus = NetworkStatus.WifiWithThreeBars; 59 break; 60 default: 61 wlanStatus = NetworkStatus.WifiWithFourBars; 62 break; 63 } 65 break; 66 } 67 } 68 break; 69 } 70 } 71 } 72 catch (Exception e) 73 { 74 Console.WriteLine("获取无线网配置失败!"); 75 } 77 return wlanStatus; 78 } 79 80 private const int INTERNET_CONNECTION_LAN = 2; 81 82 //声明外部的函数 83 [DllImport("winInet.dll ")] 84 private static extern bool InternetGetConnectedState(ref int flag, int dwReserved);
原文地址:https://www.cnblogs.com/kybs0/p/9017301.html
时间: 2024-11-08 00:22:31