如何在 Win7 中断开蓝牙设备与 C# .Net 的连接
Posted
技术标签:
【中文标题】如何在 Win7 中断开蓝牙设备与 C# .Net 的连接【英文标题】:How to disconnect a bluetooth device from C# .Net in Win7 【发布时间】:2013-02-12 09:21:05 【问题描述】:我想断开蓝牙设备与我在 Win 7 x64 上运行的 c# .Net 应用程序的连接。
我知道 MS 在 .Net 上提供的保护 BT 的功能很少。
我搜索了 32feet.Net,发现了如何连接、发现、获取信息……但没有关于断开连接(我错过了什么吗?)。
然后,我在 Msdn IOCTL_BTH_DISCONNECT_DEVICE 上找到了。问题是我无法理解如何调用它。 看来我应该将DeviceIOControl 与 Platform Invoke 一起使用,但恐怕我没有足够的 .Net 技能来自己构建它。
这是我现在的位置:
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);
有人能帮我完成这个吗?
【问题讨论】:
【参考方案1】:终于,我自己搞定了!
我在 InTheHand.Net 的代码中搜索了一下,终于明白如何制作了!
这是一些工作代码(如果你想使用它,你需要 InTheHand.Net):
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 = 0x0:X.", gle));
else
Console.WriteLine("Success !");
while (!Console.KeyAvailable) System.Threading.Thread.Sleep(200);
【讨论】:
干得好!我开始怀疑是否可以从用户模式调用它们,但显然可以。 据我所知,在蓝牙客户端类型的 obj 下有一个 Dispose() 方法,该方法也有 Connect()。不确定这是否是您想要的。 试图在此处找到连接蓝牙的命令代码ioctls.net,但找不到。任何信息将不胜感激。以上是关于如何在 Win7 中断开蓝牙设备与 C# .Net 的连接的主要内容,如果未能解决你的问题,请参考以下文章