问题描述:
当获取WIFI列表的时候,发现多获取几次,返回的列表就只剩当前连接的WIFI了,后续在程序中怎么操作都再也刷不出来了。
这种情况,在任务栏右下角再打开Windows的WIFI连接模块,就又能恢复WIFI列表的显示,明显能看出来出现这种情况,Windows也是做了某种恢复的处理,但我查不到有哪个WIndowsAPI有这个功能。
解决思路:
当出现WIFI列表刷不到数据时,触发不了WIndows的恢复处理,那就只能尝试去重启网卡适配器。 这样亲测能解决WIFI列表刷新的问题,但开关的网卡适配器需要自行选择或者进行配置。
以下是操作网卡适配器的代码:
如果使用过程中有问题,可以帮忙指出来,感谢!
代码中的BaseResult 就是返回结果的一个封装,里边有bool 和 message ;可自行过滤
/// <summary>
/// 网卡适配器操作
/// </summary>
public static class NetworkAdapterHelper
{
/// <summary>
/// 网卡适配器列表数据
/// </summary>
private static List<string> netWorkList = new List<string>();
/// <summary>
/// 获取网卡适配器列表
/// </summary>
/// <returns></returns>
public static List<string> GetNetWorkList()
{
if(netWorkList!=null && netWorkList.Count>0)
{
return netWorkList;
}
string manage = "SELECT * From Win32_NetworkAdapter";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(manage);
ManagementObjectCollection collection = searcher.Get();
netWorkList = new List<string>();
foreach (ManagementObject obj in collection)
{
netWorkList.Add(obj["Name"].ToString());
}
return netWorkList;
}
/// <summary>
/// 网卡状态
/// </summary>
/// <param name="netWorkName">网卡名</param>
/// <returns></returns>
public static bool GetNetWorkState(string netWorkName)
{
string netState = "SELECT * From Win32_NetworkAdapter";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(netState);
ManagementObjectCollection collection = searcher.Get();
foreach (ManagementObject manage in collection)
{
if (manage["Name"].ToString() == netWorkName)
{
if (manage["NetConnectionStatus"] != null)
{
if (Convert.ToInt32(manage["NetConnectionStatus"]).Equals(2))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
}
return false;
}
/// <summary>
/// 网卡适配器操作
/// </summary>
/// <param name="networkName"></param>
/// <param name="isOpen"></param>
/// <returns></returns>
public static BaseResult NetWorkOperate(string networkName,bool isOpen=true)
{
try
{
var netObj=GetNetWorkByName(networkName);
if(netObj==null)
{
return new BaseResult(false, $"未找到对应名称的网卡【{networkName}】");
}
if (GetNetWorkState(networkName)==isOpen)
{
return BaseResult.Successed;
}
if (isOpen)
{
return EnableNetWork(netObj);
}
else
{
return DisableNetWork(netObj);
}
}
catch
{
return BaseResult.Failed;
}
}
/// <summary>
/// 禁用网卡
/// </summary>
/// <param name="network">网卡对象</param>
/// <returns></returns>
private static BaseResult DisableNetWork(ManagementObject network)
{
try
{
network.InvokeMethod("Disable", null);
return BaseResult.Successed;
}
catch
{
return BaseResult.Failed;
}
}
/// <summary>
/// 启用网卡
/// </summary>
/// <param name="network">网卡对象</param>
/// <returns></returns>
private static BaseResult EnableNetWork(ManagementObject network)
{
try
{
network.InvokeMethod("Enable", null);
return BaseResult.Successed;
}
catch
{
return BaseResult.Failed;
}
}
/// <summary>
/// 根据网卡名称得到指定网卡
/// </summary>
/// <param name="networkname">网卡名字</param>
/// <returns></returns>
private static ManagementObject GetNetWorkByName(string networkname)
{
string netState = "SELECT * From Win32_NetworkAdapter";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(netState);
ManagementObjectCollection collection = searcher.Get();
foreach (ManagementObject manage in collection)
{
if (manage["Name"].ToString() == networkname)
{
return manage;
}
}
return null;
}
}