2013-02-12 3 views
2

Je souhaite déconnecter un périphérique Bluetooth de mon application C# .Net, qui fonctionne sous Win 7 x64.Comment déconnecter un périphérique Bluetooth de C# .Net dans Win7

Je sais que MS offre très peu de fonctionnalités reguarding BT sur .Net. J'ai recherché 32feet.Net, et ai trouvé comment se relier, découvrir, obtenir l'information, ... mais rien au sujet de la déconnexion (ai-je manqué quelque chose?).

Ensuite, j'ai trouvé sur Msdn IOCTL_BTH_DISCONNECT_DEVICE. Le problème est que je ne peux pas comprendre comment l'appeler. Il semble que je devrais utiliser DeviceIOControl avec Platform Invoke, mais je crains de ne pas avoir assez de compétences .Net pour le faire moi-même.

Voici où je suis en ce moment:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 
using Microsoft.Win32.SafeHandles; 
using System.IO; 

namespace BtDisco 
{ 
    class Program 
    { 
     const int IOCTL_BTH_DISCONNECT_DEVICE = 0x41000c; 

     [DllImport("Kernel32.dll", SetLastError = false, CharSet = CharSet.Auto)] 
     public static extern bool DeviceIoControl(
      Microsoft.Win32.SafeHandles.SafeFileHandle hDevice, 
      uint dwIoControlCode, 
      [MarshalAs(UnmanagedType.AsAny)] [In] object InBuffer, 
      uint nInBufferSize, 
      [MarshalAs(UnmanagedType.AsAny)] [Out] object OutBuffer, 
      uint nOutBufferSize, 
      ref uint pBytesReturned, 
      [In] ref System.Threading.NativeOverlapped Overlapped 
      ); 

     [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
     static extern SafeFileHandle CreateFile(
      string lpFileName, 
      [MarshalAs(UnmanagedType.U4)] FileAccess dwDesiredAccess, 
      [MarshalAs(UnmanagedType.U4)] FileShare dwShareMode, 
      IntPtr lpSecurityAttributes, 
      [MarshalAs(UnmanagedType.U4)] FileMode dwCreationDisposition, 
      [MarshalAs(UnmanagedType.U4)] FileAttributes dwFlagsAndAttributes, 
      IntPtr hTemplateFile); 


     static void Main(string[] args) 
     { 
      //http://msdn.microsoft.com/en-us/library/windows/desktop/aa363216(v=vs.85).aspx 
      //hDev = Use CreateFile 
      SafeFileHandle _hdev = CreateFileR(...); 

      DeviceIoControl(hDev, IOCTL_BTH_DISCONNECT_DEVICE, char[] btAddr, btAddr.Length(), result, result.Length(), ref getCnt, IntPtr.Zero); 
     } 
    } 
} 

Quelqu'un pourrait-il être assez bon pour me aider à remplir ce?

Répondre

3

Enfin, je l'ai fait fonctionner par moi-même!

J'ai cherché un peu plus dans le code InTheHand.Net et j'ai finalement compris comment le faire!

Voici un code de travail (vous aurez besoin InTheHand.Net si vous voulez l'utiliser):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Globalization; 
using System.Text; 
using InTheHand.Net; 
using InTheHand.Net.Bluetooth; 
using System.Runtime.InteropServices; 

namespace BTDisco2 
{ 
    class Program 
    { 
     const int IOCTL_BTH_DISCONNECT_DEVICE = 0x41000c; 
     [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
     internal static extern bool DeviceIoControl(
     IntPtr hDevice, 
     uint dwIoControlCode, 
     ref long InBuffer, 
     int nInBufferSize, 
     IntPtr OutBuffer, 
     int nOutBufferSize, 
     out int pBytesReturned, 
     IntPtr lpOverlapped); 

     static void Main(string[] args) 
     { 
      var r = BluetoothRadio.PrimaryRadio; 
      var h = r.Handle; 
      long btAddr = BluetoothAddress.Parse("00:1b:3d:0d:ac:31").ToInt64(); 
      int bytesReturned = 0; 
      var success = DeviceIoControl(h, 
      IOCTL_BTH_DISCONNECT_DEVICE, 
      ref btAddr, 8, 
      IntPtr.Zero, 0, out bytesReturned, IntPtr.Zero); 

      if (!success) 
      { 
       int gle = Marshal.GetLastWin32Error(); 
       Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "failure: {0} = 0x{0:X}.", gle)); 
      } 
      else 
      { 
       Console.WriteLine("Success !"); 
      } 
      while (!Console.KeyAvailable) System.Threading.Thread.Sleep(200); 
     } 
    } 
} 
+0

bien fait! Je venais de me demander s'ils pouvaient être appelés en mode utilisateur mais apparemment. – alanjmcf

+0

autant que je sache il y a une méthode Dispose() sous l'obj d'un type BluetoothClient qui a aussi le Connect(). Je ne sais pas si c'est ce que tu voulais. – Mehrad

Questions connexes