Сканирование для устройства интерфейса человека (HID) с использованием C # - PullRequest
5 голосов
/ 16 сентября 2010

Я занимаюсь разработкой приложения на C # .NET 2.0, в котором мне нужно выполнить поиск подключенного HID.Как это может быть сделано?Поскольку это HID, Windows не назначает ему COM-порт.Мне нужно только программно определить, подключено ли устройство.Спасибо.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Когда я подключаю устройство USB к моему компьютеру, в разделе Human Interface Devices * 1010 появляются две записи* в диспетчере устройств.Если щелкнуть их Свойства, откроется эта информация на соответствующих вкладках сведений:

HID-совместимое устройство Идентификатор устройства: HID \ VID_1795 & PID_6004 \ 7 & 2694D932 & 0 & 0000

USB-интерфейсУстройство Идентификатор экземпляра устройства: USB \ VID_1795 & PID_6004 \ B973000000EB0D00

Ответы [ 2 ]

6 голосов
/ 18 сентября 2010

В WMI Code Creator выберите следующие параметры:

Пространство имен: 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);
            }
        }
    }
}
0 голосов
/ 04 ноября 2018

Вот пример перечисления устройств Hid в Windows:

    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, вы можете перечислять устройства таким же образом на любой платформе, как показано ниже. См. полный текст статьи .

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