【问题标题】:Scanning for a Human Interface Device (HID) using C#使用 C# 扫描人机接口设备 (HID)
【发布时间】:2010-09-16 19:18:18
【问题描述】:

我正在开发一个 C# .NET 2.0 应用程序,我需要在其中扫描附加的 HID。如何才能做到这一点?因为它是 HID,Windows 不会为其分配 COM 端口。我只需要以编程方式确定设备是否已连接。谢谢。

附加信息

当我将 USB 设备连接到我的计算机时,设备管理器的 人机接口设备 下会出现两个条目。单击其属性会在其各自的详细信息选项卡中生成此信息:

HID 兼容设备 设备实例 ID:HID\VID_1795&PID_6004\7&2694D932&0&0000

USB 人机接口设备 设备实例 ID:USB\VID_1795&PID_6004\B973000000EB0D00

【问题讨论】:

  • 您是否正在寻找一个您知道硬件 ID 的特定 HID 或特定类别的 HID 或只是任何 HID?

标签: c# device human-interface


【解决方案1】:

在 WMI 代码创建器中选择以下选项:

命名空间:root\WMI

类:MSWmi_PnPInstanceNames

从结果框中选择InstanceNames 以获取以下代码:

using System;
using System.Management;
using System.Windows.Forms;

namespace WMISample
{
    public class MyWMIQuery
    {
        public static void Main()
        {
            try
            {
                ManagementObjectSearcher searcher = 
                    new ManagementObjectSearcher("root\\WMI", 
                    "SELECT * FROM MSWmi_PnPInstanceNames"); 

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("MSWmi_PnPInstanceNames instance");
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("InstanceName: {0}", queryObj["InstanceName"]);
                }
            }
            catch (ManagementException e)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}

【讨论】:

  • 查询 WMI 数据时出错:访问被拒绝
  • 我已经很久没有需要使用 WMI 了,但是快速的互联网搜索会产生一些有用的结果。也许这会有所帮助:docs.microsoft.com/en-us/windows/win32/wmisdk/…
  • 感谢您的帮助。我终于想出以管理员身份运行视觉工作室,我可以得到我的 wmi 列表。我想知道这如何帮助我收听我的 RFID 事件。我的设备已连接到 USB 端口,并且 windows 在人机接口设备 (HID) 中显示该设备。这个 laptp 没有端口,所以很多使用 COM 名称的示例都不起作用。这台电脑上没有 COM。但是我希望我是否可以从 WMI 访问我的 RFID 设备并提供某种查询.. 不过不确定。
【解决方案2】:

以下是枚举 Windows 上的 Hid 设备的示例:

    public static ConnectedDeviceDefinition GetDeviceDefinition(string deviceId, SafeFileHandle safeFileHandle)
    {
        try
        {
            var hidAttributes = GetHidAttributes(safeFileHandle);
            var hidCollectionCapabilities = GetHidCapabilities(safeFileHandle);
            var manufacturer = GetManufacturer(safeFileHandle);
            var serialNumber = GetSerialNumber(safeFileHandle);
            var product = GetProduct(safeFileHandle);

            return new ConnectedDeviceDefinition(deviceId)
            {
                WriteBufferSize = hidCollectionCapabilities.OutputReportByteLength,
                ReadBufferSize = hidCollectionCapabilities.InputReportByteLength,
                Manufacturer = manufacturer,
                ProductName = product,
                ProductId = (ushort)hidAttributes.ProductId,
                SerialNumber = serialNumber,
                Usage = hidCollectionCapabilities.Usage,
                UsagePage = hidCollectionCapabilities.UsagePage,
                VendorId = (ushort)hidAttributes.VendorId,
                VersionNumber = (ushort)hidAttributes.VersionNumber,
                DeviceType = DeviceType.Hid
            };
        }
        catch (Exception)
        {
            return null;
        }
    }

完整课程:https://github.com/MelbourneDeveloper/Device.Net/blob/master/src/Hid.Net/Windows/WindowsHidDeviceFactory.cs

此处的 API 调用:https://github.com/MelbourneDeveloper/Device.Net/blob/master/src/Hid.Net/Windows/HidAPICalls.cs

对于 Windows 10 (UWP) 也有类似的情况:

    public async Task<IEnumerable<ConnectedDeviceDefinition>> GetConnectedDeviceDefinitions(FilterDeviceDefinition deviceDefinition)
    {
        var aqsFilter = GetAqsFilter(deviceDefinition.VendorId, deviceDefinition.ProductId);

        var deviceInformationCollection = await wde.DeviceInformation.FindAllAsync(aqsFilter).AsTask();

        var deviceDefinitions = deviceInformationCollection.Select(d => GetDeviceInformation(d, DeviceType));

        var deviceDefinitionList = new List<ConnectedDeviceDefinition>();

        foreach (var deviceDef in deviceDefinitions)
        {
            var connectionInformation = await TestConnection(deviceDef.DeviceId);
            if (connectionInformation.CanConnect)
            {
                await Task.Delay(1000);

                deviceDef.UsagePage = connectionInformation.UsagePage;

                deviceDefinitionList.Add(deviceDef);
            }
        }

        return deviceDefinitionList;
    }

代码:https://github.com/MelbourneDeveloper/Device.Net/blob/77439b1ab0f4b3ad97376e4e62c7efac0a749783/src/Device.Net.UWP/UWPDeviceFactoryBase.cs#L47

Android (https://github.com/MelbourneDeveloper/Device.Net/blob/77439b1ab0f4b3ad97376e4e62c7efac0a749783/src/Usb.Net.Android/AndroidUsbDeviceFactory.cs#L31):

    public Task<IEnumerable<ConnectedDeviceDefinition>> GetConnectedDeviceDefinitions(FilterDeviceDefinition deviceDefinition)
    {
        return Task.Run<IEnumerable<ConnectedDeviceDefinition>>(() =>
        {
            //TODO: Get more details about the device.
            return UsbManager.DeviceList.Select(kvp => kvp.Value).Where(d => deviceDefinition.VendorId == d.VendorId && deviceDefinition.ProductId == d.ProductId).Select(GetAndroidDeviceDefinition).ToList();
        });
    }

使用 Hid.Net,您可以在任何平台上以相同的方式枚举设备,如下所示。请参阅full article

var devices = await DeviceManager.Current.GetConnectedDeviceDefinitions(new FilterDeviceDefinition { VendorId = 0x1209, ProductId = 0x53C1 });
foreach (var device in devices)
{
    Debug.WriteLine(device.DeviceId);
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2016-09-09
  • 2023-03-30
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 2020-02-18
相关资源
最近更新 更多