在Windows下检索USB键盘的序列号

zap*_*hod 3 windows hardware usb

许多USB设备包含唯一的序列号(实际上是Unicode字符串),主机可以将其与16位供应商和产品ID号一起使用,以唯一地标识设备.

我正在试图弄清楚如何编写一个能够显示连接到系统的所有USB人机接口设备列表的Windows应用程序.该列表对于每个HID都有一行,包括系统键盘.列表中将列出供应商ID,产品ID和序列号.

我可以通过SetupDiGetClassDevs使用返回的GUID 调用HidD_GetHidGuid并通过重复调用循环遍历结果来获取USB HID列表SetupDiEnumDeviceInterfaces.然后我可以调用SetupDiGetDeviceInterfaceDetail以获取每个设备的路径,我可以打开它CreateFile,只要我小心不要求读取或写入权限,这将被系统键盘拒绝.从那里我可以通过调用获得供应商和产品ID号HidD_GetAttributes.

我弄清楚的是如何检索序列号字符串.当我搜索这个问题的解决方案时,我发现了很多关于如何获取USB大容量存储设备的序列号的信息,但看起来没有什么看起来可能适用于任何其他类型的USB设备.我很乐意发现检索序列号字符串的泛型方法或特定于HID的方法.

我有一个到Win32的移植的感觉libusb可能没有太多的麻烦管理这个,但不幸的是,我需要一个只依赖Windows自带的库,如一个解决方案setupapi,并hid包含上述功能的DLL.

任何建议将非常感谢!

zap*_*hod 5

事实证明,HID.dll定义一个被调用的函数HidD_GetSerialNumberString,它完全符合我的要求,给定了我从CreateFile上面得到的句柄.刚试了一下,效果很好.还有HidD_GetManufacturerStringHidD_GetProductString函数来检索设备描述符中引用的其他字符串描述符,甚至是HidD_GetIndexedString获取给定其索引的任意字符串描述符(可能是因为允许HID描述符包含字符串描述符索引).我觉得现在很傻 - 这个答案就在我的鼻子底下.

感谢大家花时间阅读并回答我的问题!我将继续接受Alphaneo的回答,因为它听起来非常有希望,事实上,当我偶然发现这个答案时,我正在等待DDK下载.