如何枚举所有HID设备? C#

时间:2011-12-02 10:09:41

标签: c# .net usb hid

我需要枚举连接到我的电脑的所有HID设备。我尝试使用this answer,但它枚举了USBHub设备,我找不到我的HID设备。

修改: 我很高兴知道如果有任何WIN32 API方法,使用PID和VID获取USB设备状态(在线/离线)?

3 个答案:

答案 0 :(得分:2)

Microsoft's WDK包含HID功能的文档以及如何使用它们的概述。 WDK还包括用于访问HID类设备的Visual C ++程序的头文件(hidsdi.h,hidusage.h,hidpi.h)。

点击此链接Jan Axelson's Lakeview Research - HID Windows Programming.

以下是您在问题中指定的有关HID设备的问题: Scanning for a Human Interface Device (HID) using C#

答案 1 :(得分:2)

我找到了答案。 This link解释了如何使用ManagementObjectSearcher执行此操作。

感谢所有回复的人!

答案 2 :(得分:0)

您可以使用以下Windows API枚举Hid设备:

        public static Collection<DeviceInformation> GetConnectedDeviceInformations()
        {
            var deviceInformations = new Collection<DeviceInformation>();
            var spDeviceInterfaceData = new SpDeviceInterfaceData();
            var spDeviceInfoData = new SpDeviceInfoData();
            var spDeviceInterfaceDetailData = new SpDeviceInterfaceDetailData();
            spDeviceInterfaceData.CbSize = (uint)Marshal.SizeOf(spDeviceInterfaceData);
            spDeviceInfoData.CbSize = (uint)Marshal.SizeOf(spDeviceInfoData);

            var hidGuid = new Guid();

            APICalls.HidD_GetHidGuid(ref hidGuid);

            var i = APICalls.SetupDiGetClassDevs(ref hidGuid, IntPtr.Zero, IntPtr.Zero, APICalls.DigcfDeviceinterface | APICalls.DigcfPresent);

            if (IntPtr.Size == 8)
            {
                spDeviceInterfaceDetailData.CbSize = 8;
            }
            else
            {
                spDeviceInterfaceDetailData.CbSize = 4 + Marshal.SystemDefaultCharSize;
            }

            var x = -1;

            while (true)
            {
                x++;

                var setupDiEnumDeviceInterfacesResult = APICalls.SetupDiEnumDeviceInterfaces(i, IntPtr.Zero, ref hidGuid, (uint)x, ref spDeviceInterfaceData);
                var errorNumber = Marshal.GetLastWin32Error();

                //TODO: deal with error numbers. Give a meaningful error message

                if (setupDiEnumDeviceInterfacesResult == false)
                {
                    break;
                }

                APICalls.SetupDiGetDeviceInterfaceDetail(i, ref spDeviceInterfaceData, ref spDeviceInterfaceDetailData, 256, out _, ref spDeviceInfoData);

                var deviceInformation = GetDeviceInformation(spDeviceInterfaceDetailData.DevicePath);
                if (deviceInformation == null)
                {
                    continue;
                }

                deviceInformations.Add(deviceInformation);
            }

            APICalls.SetupDiDestroyDeviceInfoList(i);

            return deviceInformations;
}

全班:https://github.com/MelbourneDeveloper/Hid.Net/blob/master/Hid.Net/Windows/WindowsHIDDevice.cs

APIS:https://github.com/MelbourneDeveloper/Hid.Net/blob/master/Hid.Net/Windows/APICalls.cs