C# 如何打开实际上已关闭的Wifi适配器的收音机?

C# 如何打开实际上已关闭的Wifi适配器的收音机?,c#,.net,interop,wifi,C#,.net,Interop,Wifi,我正在使用以获取Wifi适配器的无线电状态。 万一收音机真的关了,我怎么才能把它打开呢 大概是这样的: WlanClient wlanClient = new WlanClient() var targetInterface = wlanClient.Interfaces.FirstOrDefault() if (targetInterface != null) { bool radioIsOff = targetInterface .RadioState.PhyRadioState[0

我正在使用以获取Wifi适配器的无线电状态。 万一收音机真的关了,我怎么才能把它打开呢

大概是这样的:

WlanClient wlanClient = new WlanClient()
var targetInterface = wlanClient.Interfaces.FirstOrDefault()
if (targetInterface != null)
{
    bool radioIsOff = targetInterface .RadioState.PhyRadioState[0].dot11SoftwareRadioState == Wlan.Dot11RadioState.Off;
    if (radioIsOff)
    {
       // TODO
    }
}

我刚刚将其添加到托管Wifi API的
WlanInterface
类中:

        IntPtr radioStatePtr = new IntPtr(0L);
        try
        {
            Wlan.WlanPhyRadioState radioState = new Wlan.WlanPhyRadioState();
            radioState.dwPhyIndex = 0; // TODO : can change ???
            radioState.dot11HardwareRadioState = Wlan.Dot11RadioState.On; // ignored in fact, according to http://msdn.microsoft.com/en-us/library/windows/desktop/ms706791(v=vs.85).aspx 
            radioState.dot11SoftwareRadioState = Wlan.Dot11RadioState.On;

            radioStatePtr = Marshal.AllocHGlobal(Marshal.SizeOf(radioState));
            Marshal.StructureToPtr(radioState, radioStatePtr, false);

            Wlan.ThrowIfError(
                Wlan.WlanSetInterface(
                            client.clientHandle,
                            info.interfaceGuid,
                            Wlan.WlanIntfOpcode.RadioState,
                            (uint)Marshal.SizeOf(typeof(Wlan.WlanPhyRadioState)),
                            radioStatePtr,
                            IntPtr.Zero));
        }
        finally
        {
            if (radioStatePtr.ToInt64() != 0)
                Marshal.FreeHGlobal(radioStatePtr);
        }

在Win 7上进行了测试。

我一直在努力解决这个问题,我只想与大家分享我的解决方案

(下载上面推荐的托管wifi) 将WlanApi.cs和Interop.cs添加到项目中。 使用NativeWifi添加

在WLANPI.cs中 改为: 公共IntPtr clientHandle; (您需要clientHandle。不确定为什么将其设置为private?)

使用此代码:

string arg1 = "true"; //set to false if you want to turn it off.
      arg1 = arg1.ToLower();
            IntPtr radioStatePtr = new IntPtr(0L);
            try
            {
                WlanClient wc = new WlanClient();

                
                foreach (var iface in wc.Interfaces)
                {
                    //WlanInterface
                    if(iface.InterfaceName.ToLower()=="wifi")
                    { 
                    Wlan.WlanPhyRadioState radioState = new Wlan.WlanPhyRadioState();
                    radioState.dwPhyIndex = 0;
                    if(arg1=="true")
                    { 
                        radioState.dot11HardwareRadioState = Wlan.Dot11RadioState.On;
                        radioState.dot11SoftwareRadioState = Wlan.Dot11RadioState.On;
                    }
                    else
                    {
                        radioState.dot11HardwareRadioState = Wlan.Dot11RadioState.Off;
                        radioState.dot11SoftwareRadioState = Wlan.Dot11RadioState.Off;
                    }
                    radioStatePtr = Marshal.AllocHGlobal(Marshal.SizeOf(radioState));
                    Marshal.StructureToPtr(radioState, radioStatePtr, false);

                    Wlan.WlanSetInterface(wc.clientHandle, iface.InterfaceGuid, Wlan.WlanIntfOpcode.RadioState, (uint)Marshal.SizeOf(typeof(Wlan.WlanPhyRadioState)), radioStatePtr, IntPtr.Zero);
                    }

                }
               
            }
            finally
            {
                if (radioStatePtr.ToInt64() != 0)
                    Marshal.FreeHGlobal(radioStatePtr);
            }
祝你好运:)