我目前正在开发一个为 USB 键盘配置 RGB 照明的应用程序。该键盘符合 HID(人机接口设备)规范,允许通过 HID 功能报告进行定制。然而,我遇到了意想不到的行为。
我对HID规范的理解是,HID功能报告对于每个可配置选项都有特定的报告ID,
HidD_GetFeature
用于检索每个选项的当前状态,HidD_SetFeature
用于修改它。然而,这一特定键盘只有一个报告 ID 和用于双向通信的单一功能报告结构。例如,要获取固件版本,我必须使用适当的查询构建一个功能报告结构,并且设备以包含固件版本的功能报告进行响应。
在我看来,Windows HID API 的设计并未真正适应这种通过功能报告进行双向通信的方式,因为我似乎没有任何方式可以等待或收到通知,新功能报告的到来。这意味着我必须调用
HidD_SetFeature
,睡眠任意时间,然后调用 HidD_GetFeature
。这种方法意味着始终有可能接收到陈旧或不正确的数据。
我的问题是:是否有更有效的方法来处理功能报告的双向通信?具体来说,有没有一种方法可以在不依赖睡眠的情况下通知新功能报告的到来或等待新功能报告的到来?
根据 HID 规范,无法收到有关功能报告的通知:
注意。仅输入报告通过中断输入管道发送。功能和输出报告必须由主机通过控制管道或可选的中断输出管道启动。
可以使用 ReadFile API 从设备界面读取输入报告。或者,您可以处理 RawInput API
WM_INPUT
消息 - 它将包含相同的输入报告。
请注意,出于安全原因,您无法直接在 Windows 中从 HID 键盘读取输入数据。
请参阅 HID 规范 和 通过用户模式应用程序获取 HID 报告了解更多信息。