3

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

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

我可以通过SetupDiGetClassDevs使用返回的 GUID调用HidD_GetHidGuid并通过重复调用SetupDiEnumDeviceInterfaces. 然后,我可以调用SetupDiGetDeviceInterfaceDetail以获取每个设备的路径,我可以使用CreateFile. 从那里我可以通过调用HidD_GetAttributes.

我无法弄清楚如何检索序列号字符串。当我搜索此问题的解决方案时,我发现了很多有关如何获取 USB 大容量存储设备序列号的信息,但似乎没有任何信息适用于任何其他类型的 USB 设备。我很高兴发现检索序列号字符串的通用方法或 HID 特定方法。

我有一种感觉,Win32 端口libusb可以轻松管理这个问题,但不幸的是,我需要一个仅依赖于 Windows 附带的库的解决方案,例如包含上述功能的 DLLsetupapi和DLL。hid

任何建议将不胜感激!

4

5 回答 5

5

事实证明,给定如上所述的句柄,它HID.dll定义了一个调用的函数HidD_GetSerialNumberString,它完全符合我的要求。CreateFile刚刚试了一下,效果很好。还有一些函数可以检索设备描述符HidD_GetManufacturerStringHidD_GetProductString引用的其他字符串描述符,甚至可以在HidD_GetIndexedString给定索引的情况下获取任意字符串描述符(可能是因为允许 HID 描述符包含字符串描述符索引)。我现在觉得很傻——答案一直就在我的眼皮底下。

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

于 2009-04-23T04:19:45.480 回答
3

有没有试过DDK自带的USBVIew源代码。USBView 工具显示任何 USB 设备的序列号,并且源随 DDK 一起提供。

于 2009-04-22T02:06:44.560 回答
0

您是否尝试过搜索 Hid 键盘的输入记录、输出记录和功能记录的 HID 定义文档。这应该向您显示您可以通过 HID 退出/进入键盘的“事物”列表。

另外,我知道可以通过软件枚举 HID 记录定义。大约 1 年前我做过类似的事情,但我不记得头顶的细节了。这样做可以让您看到键盘 USB 类作为标准接口发布的内容。

我希望它可以为您提供一些指导,以找出您正在寻找的东西。对不起,我不能更精确!

于 2009-04-09T12:51:13.993 回答
0

我推荐这本书USB Complete。第 4 章枚举:主机如何了解设备具有您需要的信息。

此页面有许多指向信息的链接,以及指向您可以使用的库和实用程序的链接。

于 2009-04-13T18:09:10.817 回答
0

您可以使用它GetVolumeInformation来获取连接的任何硬件的序列号。

于 2010-03-08T09:37:05.090 回答