回答

1

您需要P/Invoke GetDeviceListChangeRadioStateossvcs.dll。实际执行此操作的代码对于SO帖子来说有点长,所以我会留给你,让它解决 - 这不是非常困难(有一些C code here,甚至有一些C# code on CodeProject,我没有用过它所以YMMV)。

另一种选择是在SDF中使用Radios类,它已包含这些类。

2

第一:导入这些DLL

[DllImport("ossvcs.dll", EntryPoint = "#276", CharSet = CharSet.Unicode)] 
    private static extern uint GetWirelessDevice(ref IntPtr pDevice, int pDevVal); 

    [DllImport("ossvcs.dll", EntryPoint = "#273", CharSet = CharSet.Unicode)] 
    private static extern uint ChangeRadioState(ref RDD pDevice, int dwState, int saveAction); 

    [DllImport("ossvcs.dll", EntryPoint = "#280", CharSet = CharSet.Unicode)] 
    private static extern uint FreeDeviceList(IntPtr pDevice); 

下面是我使用的摩托罗拉MC65,这应该为你的工作以及代码的副本。

[StructLayout(LayoutKind.Auto)] 
    struct RADIODEVSTATE 
    { 
     public const int RADIODEVICES_ON = 1; 
     public const int RADIODEVICES_OFF = 0; 
    } 

    /* 
    typedef enum _RADIODEVTYPE 
    { 
     RADIODEVICES_MANAGED = 1, 
     RADIODEVICES_PHONE, 
     RADIODEVICES_BLUETOOTH, 
    } RADIODEVTYPE; 
    */ 
    [StructLayout(LayoutKind.Auto, CharSet = CharSet.Unicode)] 
    struct RADIODEVTYPE 
    { 
     public const int RADIODEVICES_MANAGED = 1; 
     public const int RADIODEVICES_PHONE = 2; 
     public const int RADIODEVICES_BLUETOOTH = 3; 
    } 

    /* 
    typedef enum _SAVEACTION 
    { 
     RADIODEVICES_DONT_SAVE = 0, 
     RADIODEVICES_PRE_SAVE, 
     RADIODEVICES_POST_SAVE, 
    } SAVEACTION; 
    */ 
    [StructLayout(LayoutKind.Auto, CharSet = CharSet.Unicode)] 
    struct SAVEACTION 
    { 
     public const int RADIODEVICES_DONT_SAVE = 0; 
     public const int RADIODEVICES_PRE_SAVE = 1; 
     public const int RADIODEVICES_POST_SAVE = 2; 
    } 

    /* 
    struct RDD 
    { 
     RDD() : pszDeviceName(NULL), pNext(NULL), pszDisplayName(NULL) {} 
     ~RDD() { LocalFree(pszDeviceName); LocalFree(pszDisplayName); } 
     LPTSTR pszDeviceName; // Device name for registry setting. 
     LPTSTR pszDisplayName; // Name to show the world 
     DWORD dwState;  // ON/off/[Discoverable for BT] 
     DWORD dwDesired;  // desired state - used for setting registry etc. 
     RADIODEVTYPE DeviceType;   // Managed, phone, BT etc. 
     RDD * pNext; // Next device in list 
    }; //radio device details 
    */ 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
    struct RDD 
    { 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pszDeviceName; 

     [MarshalAs(UnmanagedType.LPTStr)] 
     public string pszDisplayName; 

     public uint dwState; 
     public uint dwDesired; 
     public int DeviceType; 
     public IntPtr pNext; 
    } 


    private static bool SetDeviceState(int dwDevice, int dwState) 
    { 
     var pDevice = new IntPtr(0); 

     //Get the first wireless device 
     var result = GetWirelessDevice(ref pDevice, 0); 

     if (result != 0) 
      return false; 

      //While we're still looking at wireless devices 
      while (pDevice != IntPtr.Zero) 
      { 
       //Marshall the pointer into a C# structure 
       var device = (RDD)System.Runtime.InteropServices.Marshal.PtrToStructure(pDevice, typeof(RDD)); 

       //If this device is the device we're looking for 
       if (device.DeviceType == dwDevice) 
       { 
        //Change the state of the radio 
        result = ChangeRadioState(ref device, dwState, SAVEACTION.RADIODEVICES_PRE_SAVE); 
       } 

       //Set the pointer to the next device in the linked list 
       pDevice = device.pNext; 
      } 

      //Free the list of devices 
      FreeDeviceList(pDevice); 

     //Turning off radios doesn't correctly report the status, so return true anyway. 
     return result == 0 || dwState == RADIODEVSTATE.RADIODEVICES_OFF; 
    } 

并关掉手机只需拨打下面的方法:

/// <summary> 
    /// Disables the phone radio on device 
    /// </summary> 
    public void DisablePhoneRadio() 
    { 
      SetDeviceState(RADIODEVTYPE.RADIODEVICES_PHONE, RADIODEVSTATE.RADIODEVICES_OFF); 
    } 

所以只使用需要什么条件语句,并调用DisablePhoneRadio()每当你需要禁用它,使手机时无线电只是扑打了与RADIODEVSTATE.RADIODEVICES_ON的RADIODEVSTATE.RADIODEVICES_OFF像这样:

/// <summary> 
    /// Enables the phone radio on device 
    /// </summary> 
    public void EnablePhoneRadio() 
    { 
      SetDeviceState(RADIODEVTYPE.RADIODEVICES_PHONE, RADIODEVSTATE.RADIODEVICES_ON); 
    } 

希望这有助于!