在c#中通过设备名称获取蓝牙设备的COM端口

2024-04-05

我用 C# 编写一些代码来获取映射具有特定名称的蓝牙设备的 COM 端口。我尝试了几种与列出的类似的解决方案here https://stackoverflow.com/questions/25908734/get-name-of-bluetooth-device-on-the-devices-and-printers-window,但没有一个我可以访问蓝牙设置窗口中的名称,如下图所示:

如果它在那个窗口上,我确信有办法找到它。有什么帮助吗?

多谢


寻找解决方案后, 这是我发现的(我将其用于我的项目)

Main()
{

    AvailablePorts ports = new AvailablePorts();
    ports.GetBluetoothCOMPort();
    System.Collections.ObjectModel.ObservableCollection<COMPort> obs = ports.COMPorts;

}

现在,创建一个新类并添加这些引用

using System;
using System.Collections.Generic;
using System.Management;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Globalization;
using System.Collections.ObjectModel;
using System.Windows;
using System.Management.Automation;


public class AvailablePorts
{
    private ObservableCollection<COMPort> comPorts = new ObservableCollection<COMPort>();
    public ObservableCollection<COMPort> COMPorts
    {
        get => comPorts;
        set
        {
            comPorts = value;
        }
    }

    private string ExtractBluetoothDevice(string pnpDeviceID)
    {
        int startPos = pnpDeviceID.LastIndexOf('_') + 1;
        return pnpDeviceID.Substring(startPos);
    }

    private string ExtractDevice(string pnpDeviceID)
    {
        int startPos = pnpDeviceID.LastIndexOf('&') + 1;
        int length = pnpDeviceID.LastIndexOf('_') - startPos;
        return pnpDeviceID.Substring(startPos, length);
    }

    private string ExtractCOMPortFromName(string name)
    {
        int openBracket = name.IndexOf('(');
        int closeBracket = name.IndexOf(')');
        return name.Substring(openBracket + 1, closeBracket - openBracket - 1);
    }

    private string ExtractHardwareID(string fullHardwareID)
    {
        int length = fullHardwareID.LastIndexOf('_');
        return fullHardwareID.Substring(0, length);
    }

    private bool TryFindPair(string pairsName, string hardwareID, List<ManagementObject> bluetoothCOMPorts, out COMPort comPort)
    {
        foreach (ManagementObject bluetoothCOMPort in bluetoothCOMPorts)
        {
            string itemHardwareID = ((string[])bluetoothCOMPort["HardwareID"])[0];
            if (hardwareID != itemHardwareID && ExtractHardwareID(hardwareID) == ExtractHardwareID(itemHardwareID))
            {
                comPort = new COMPort(ExtractCOMPortFromName(bluetoothCOMPort["Name"].ToString()), Direction.INCOMING, pairsName);
                return true;
            }
        }
        comPort = null;
        return false;
    }

    private string GetDataBusName(string pnpDeviceID)
    {
        using (PowerShell PowerShellInstance = PowerShell.Create())
        {
            PowerShellInstance.AddScript($@"Get-PnpDeviceProperty -InstanceId '{pnpDeviceID}' -KeyName 'DEVPKEY_Device_BusReportedDeviceDesc' | select-object Data");

            Collection<PSObject> PSOutput = PowerShellInstance.Invoke();

            foreach (PSObject outputItem in PSOutput)
            {
                if (outputItem != null)
                {
                    Console.WriteLine(outputItem.BaseObject.GetType().FullName);
                    foreach (var p in outputItem.Properties)
                    {
                        if (p.Name == "Data")
                        {
                            return p.Value?.ToString();
                        }
                    }
                }
            }
        }
        return string.Empty;
    }


    public void GetBluetoothCOMPort()
    {
        COMPorts.Clear();


        ManagementObjectCollection results = new ManagementObjectSearcher(
            @"SELECT PNPClass, PNPDeviceID, Name, HardwareID FROM Win32_PnPEntity WHERE (Name LIKE '%COM%' AND PNPDeviceID LIKE '%BTHENUM%' AND PNPClass = 'Ports') OR (PNPClass = 'Bluetooth' AND PNPDeviceID LIKE '%BTHENUM\\DEV%')").Get();

        List<ManagementObject> bluetoothCOMPorts = new List<ManagementObject>();
        List<ManagementObject> bluetoothDevices = new List<ManagementObject>();

        foreach (ManagementObject queryObj in results)
        {
            if (queryObj["PNPClass"].ToString() == "Bluetooth")
            {
                bluetoothDevices.Add(queryObj);
            }
            else if (queryObj["PNPClass"].ToString() == "Ports")
            {
                bluetoothCOMPorts.Add(queryObj);
            }
        }

        foreach (ManagementObject bluetoothDevice in bluetoothDevices)
        {
            foreach (ManagementObject bluetoothCOMPort in bluetoothCOMPorts)
            {
                string comPortPNPDeviceID = bluetoothCOMPort["PNPDeviceID"].ToString();
                if (ExtractBluetoothDevice(bluetoothDevice["PNPDeviceID"].ToString()) == ExtractDevice(comPortPNPDeviceID))
                {
                    COMPort outgoingPort = new COMPort(ExtractCOMPortFromName(bluetoothCOMPort["Name"].ToString()), Direction.OUTGOING, $"{bluetoothDevice["Name"].ToString()} \'{GetDataBusName(comPortPNPDeviceID)}\'");

                    Application.Current.Dispatcher.Invoke(() => {
                        COMPorts.Add(outgoingPort);
                    });

                    if (TryFindPair(bluetoothDevice["Name"].ToString(), ((string[])bluetoothCOMPort["HardwareID"])[0], bluetoothCOMPorts, out COMPort incomingPort))
                    {
                        Application.Current.Dispatcher.Invoke(() => {
                            COMPorts.Add(incomingPort);
                        });
                    }
                }
            }
        }
    }
}



public class COMPort : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    private string comPortPort;
    public string SerialPort
    {
        get => comPortPort;
        set
        {
            comPortPort = value;
            RaisePropertyChanged();
        }
    }

    private Direction comPortDirection;
    public Direction Direction
    {
        get => comPortDirection;
        set
        {
            comPortDirection = value;
            RaisePropertyChanged();
        }
    }

    private string comPortName;
    public string Name
    {
        get => comPortName;
        set
        {
            comPortName = value;
            RaisePropertyChanged();
        }
    }

    public COMPort(string comPortPort, Direction comPortDirection, string comPortName)
    {
        SerialPort = comPortPort;
        Direction = comPortDirection;
        Name = comPortName;
    }
}


public class DirectionConverter 
{
    private const string UNDEFINED_DIRECTION = "UNDEFINED";
    private const string INCOMING_DIRECTION = "Incoming";
    private const string OUTGOING_DIRECTION = "Outgoing";

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        switch ((Direction)value)
        {
            case Direction.UNDEFINED:
                return UNDEFINED_DIRECTION;
            case Direction.INCOMING:
                return INCOMING_DIRECTION;
            case Direction.OUTGOING:
                return OUTGOING_DIRECTION;
        }

        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

public enum Direction
{
    UNDEFINED,
    INCOMING,
    OUTGOING
}

发现于:https://social.msdn.microsoft.com/Forums/Azure/en-US/b9d0adc3-b489-4245-91b9-6016a89302b9/get-bluetooth-com-ports?forum=csharpgeneral https://social.msdn.microsoft.com/Forums/Azure/en-US/b9d0adc3-b489-4245-91b9-6016a89302b9/get-bluetooth-com-ports?forum=csharpgeneral

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在c#中通过设备名称获取蓝牙设备的COM端口 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • Qt 支持 Windows 蓝牙 API 吗?

    谁能告诉我 Qt 是否支持 Windows 蓝牙 API 如果是这样 您能否分享一些有关如何使用它的信息 自上次答复以来 这个问题的答案发生了一些变化 Qt 5 2 版为 Linux BlueZ 和 BlackBerry 设备实现了蓝牙 A
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐