简体   繁体   English

使用C#扫描人机接口设备(HID)

[英]Scanning for a Human Interface Device (HID) using C#

I am developing a C# .NET 2.0 application wherein I need to scan for an attached HID. 我正在开发C#.NET 2.0应用程序,其中需要扫描附加的HID。 How can this be done? 如何才能做到这一点? Because it is a HID, Windows does not assign a COM port to it. 因为它是HID,所以Windows不会为其分配COM端口。 I only need to programmatically determine if the device is attached. 我只需要以编程方式确定设备是否已连接。 Thank you. 谢谢。

ADDITIONAL INFORMATION 附加信息

When I connect the USB device to my computer two entries appear under Human Interface Devices in the Device Manager. 当我将USB设备连接到计算机时,“设备管理器”中的“ 人机界面设备”下会出现两个条目。 Clicking into their Properties yields this information in their respective Details tabs: 单击其属性可在其各自的“详细信息”选项卡中产生此信息:

HID-compliant device Device Instance Id: HID\\VID_1795&PID_6004\\7&2694D932&0&0000 符合HID的设备设备实例ID:HID \\ VID_1795&PID_6004 \\ 7&2694D932&0&0000

USB Human Interface Device Device Instance Id: USB\\VID_1795&PID_6004\\B973000000EB0D00 USB人机界面设备设备实例ID:USB \\ VID_1795&PID_6004 \\ B973000000EB0D00

In the WMI Code Creator select these options: 在WMI代码创建器中,选择以下选项:

Namespace: root\\WMI 命名空间:root \\ WMI

Class: MSWmi_PnPInstanceNames 类:MSWmi_PnPInstanceNames

Select InstanceNames from the Results box for the following code: 从“结果”框中选择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);
            }
        }
    }
}

Here is an example of enumerating Hid devices on Windows: 这是枚举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;
        }
    }

Full class here: https://github.com/MelbourneDeveloper/Device.Net/blob/master/src/Hid.Net/Windows/WindowsHidDeviceFactory.cs 完整课程在这里: https : //github.com/MelbourneDeveloper/Device.Net/blob/master/src/Hid.Net/Windows/WindowsHidDeviceFactory.cs

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

Here is a similar thing for Windows 10 (UWP): 对于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;
    }

Code: https://github.com/MelbourneDeveloper/Device.Net/blob/77439b1ab0f4b3ad97376e4e62c7efac0a749783/src/Device.Net.UWP/UWPDeviceFactoryBase.cs#L47 代码: 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 ): 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();
        });
    }

Using Hid.Net, you can enumerate devices in the same way on any platform like below. 使用Hid.Net,您可以在以下任何平台上以相同的方式枚举设备。 See the full article . 请参阅全文

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM