Windows.Devices.Bluetooth无法断开已连接的蓝牙

志雄 夏 0 信誉分
2024-11-14T01:47:38.54+00:00

用户的图像

winfrom 中采用Windows.Devices.Bluetooth来实现连接nordic蓝牙设备(52840),连接成功后,我无法断开已经连接的设备?很奇怪官方文档没有断开的说明,找不到任何相关断开低功率设备的文档代码,能找到的只有device.Dispose();但是毫无作用?为什么是因为win api底层问题吗?

Windows 窗体
Windows 窗体
一组用于开发图形用户界面的 .NET Framework 托管库。
115 个问题
通用 Windows 平台 (UWP)
通用 Windows 平台 (UWP)
一个 Microsoft 平台,用于生成和发布适用于 Windows 桌面设备的应用。
55 个问题
Windows API - Win32
Windows API - Win32
一组适用于桌面和服务器应用程序的核心 Windows 应用程序编程接口 (API)。 以前称为 Win32 API。
116 个问题
C#
C#
一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。
193 个问题
0 个注释 无注释
{count} 票

1 个答案

排序依据: 非常有帮助
  1. Junjie Zhu - MSFT 19,746 信誉分 Microsoft 供应商
    2024-11-14T07:53:32.2266667+00:00

    你好

    欢迎来到微软问答!

    推荐你使用 win32 API DeviceIoControl 中的 IOCTL_BTH_DISCONNECT_DEVICE IOCTL 来断开蓝牙连接。

    你可以参考一下以下代码。我没有设备测试,你可以尝试一下。

    // Define the IOCTL code for disconnecting a Bluetooth device
        const int IOCTL_BTH_DISCONNECT_DEVICE = 0x41000c;
    
        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode,
            IntPtr lpInBuffer, uint nInBufferSize,
            IntPtr lpOutBuffer, uint nOutBufferSize,
            ref uint lpBytesReturned, IntPtr lpOverlapped);
    
        static void Main()
        {
            // Replace this with the actual Bluetooth address of your target device
            ulong remoteDeviceAddress = /* Your target device's address */;
    
            IntPtr hDevice = IntPtr.Zero;
            try
            {
                hDevice = CreateFile("\\\\.\\BthModem", FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);
                if (hDevice != IntPtr.Zero)
                {
                    uint bytesReturned = 0;
                    bool success = DeviceIoControl(hDevice, IOCTL_BTH_DISCONNECT_DEVICE,
                        Marshal.AllocHGlobal(sizeof(ulong)), sizeof(ulong),
                        IntPtr.Zero, 0, ref bytesReturned, IntPtr.Zero);
    
                    if (success)
                    {
                        Console.WriteLine("Bluetooth device disconnected successfully.");
                    }
                    else
                    {
                        Console.WriteLine("Failed to disconnect the Bluetooth device.");
                    }
                }
                else
                {
                    Console.WriteLine("Error opening the Bluetooth device.");
                }
            }
            finally
            {
                if (hDevice != IntPtr.Zero)
                {
                    CloseHandle(hDevice);
                }
            }
        }
    
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr CreateFile(string lpFileName, FileAccess dwDesiredAccess,
            FileShare dwShareMode, IntPtr lpSecurityAttributes, FileMode dwCreationDisposition,
            uint dwFlagsAndAttributes, IntPtr hTemplateFile);
    
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool CloseHandle(IntPtr hObject);
    

    谢谢。


    如果答案是正确的解决方案,请点击“接受答案”并点赞。如果您对此答案还有其他问题,请点击“评论”。 注意:如果您想收到此主题的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。


你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。