代码之家  ›  专栏  ›  技术社区  ›  Scott Nimrod

如何识别当前已断开连接的配对蓝牙设备?

  •  0
  • Scott Nimrod  · 技术社区  · 7 年前

    如何查找当前已断开连接的配对蓝牙设备?

    我使用Windows 10 SDK尝试了以下代码:

    using Windows.Devices.Enumeration;
    using Windows.Devices.Bluetooth.Rfcomm;
    
    var serviceInfoCollection = await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort));
    

    我也试过以下方法:

    using System;
    using System.Diagnostics;
    using System.Management;
    
    public class Win32_UsbDriveWatcher
    {
        ManagementEventWatcher m_watcher;
    
        public delegate void DeviceInsertedEventHandler(object sender, Win32_UsbDriveInsertEventArgs e);
    
        public event DeviceInsertedEventHandler DeviceInserted;
        public event EventHandler DeviceRemoved;
    
        public void Start(int pollingInterval)
        {
            try
            {
                var queryString =
                  "SELECT * " +
                  " FROM __InstanceOperationEvent" +
                  " WITHIN " + pollingInterval +
                  " WHERE TargetInstance ISA 'Win32_PnPEntity'";
    
                var processQuery = new EventQuery(queryString);
    
                m_watcher = new ManagementEventWatcher(processQuery);
                m_watcher.EventArrived += EventArrived;
                m_watcher.Start();
            }
    
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }
    
        void EventArrived(object sender, EventArrivedEventArgs e)
        {
            var instance = ((PropertyData)(e.NewEvent.Properties["TargetInstance"]));
            var obj = (ManagementBaseObject)instance.Value;
            var args = new Win32_UsbDriveInsertEventArgs();
    
            if ((string)obj["InterfaceType"] == "BLUETOOTH")
            {
                args.IsCreated = (obj.ClassPath.ClassName == "__InstanceCreationEvent");
                args.DriveName = GetDriveLetterFromDisk((string)obj["Name"]);
                if (args.IsCreated)
                {
                    DeviceInserted?.Invoke(this, args);
                }
                else
                {
                    DeviceRemoved?.Invoke(this, EventArgs.Empty);
                }
            }
        }
    
        static string GetDriveLetterFromDisk(string name)
        {
            name = name.Replace("\\", "\\\\");
    
            var query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + name + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition";
            var queryDrive = new ObjectQuery(query);
            using (var searcherDrive = new ManagementObjectSearcher(queryDrive))
            {
                foreach (ManagementObject drive in searcherDrive.Get())
                {
                    query = "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" +
                      drive["DeviceID"] +
                      "'} WHERE AssocClass = Win32_LogicalDiskToPartition";
                    var queryPartition = new ObjectQuery(query);
                    using (var searcherPartition = new ManagementObjectSearcher(queryPartition))
                    {
                        foreach (ManagementObject disk in searcherPartition.Get())
                        {
                            return (string)disk["Name"];
                        }
                    }
                }
                return string.Empty;
            }
        }
    }
    public class Win32_UsbDriveInsertEventArgs : EventArgs
    {
        public bool IsCreated;
        public string DriveName;
    }
    

    有什么建议吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   theduck    5 年前

    几乎没有办法:

    1. 使用WM_DEVICE_CHANGE消息了解设备连接和断开连接的时间。
    2. 尝试使用DeviceIOControl(最佳方式)连接到设备的SDP服务。