有没有一种方法可以将USB HID使用ID转换为Windows操作系统中的虚拟密钥代码?
例如,
HID使用ID 0x 04---〉虚拟密钥是0x 41(这是密钥A)
HID使用ID 0x 91---〉虚拟密钥为0xE 9(这是OEM特定密钥)
HID使用ID 0x 87---〉虚拟密钥为0xC 1(这是保留密钥代码)
...
我刚刚找到了一个virtual keys code table,但我找不到一个翻译表或一种有效地翻译它的方法。
有没有一种方法可以将USB HID使用ID转换为Windows操作系统中的虚拟密钥代码?
例如,
HID使用ID 0x 04---〉虚拟密钥是0x 41(这是密钥A)
HID使用ID 0x 91---〉虚拟密钥为0xE 9(这是OEM特定密钥)
HID使用ID 0x 87---〉虚拟密钥为0xC 1(这是保留密钥代码)
...
我刚刚找到了一个virtual keys code table,但我找不到一个翻译表或一种有效地翻译它的方法。
2条答案
按热度按时间zvokhttg1#
没有API在HID使用ID和虚拟密钥代码之间进行转换。转换由设备驱动程序执行。
键盘的Usage ID在http://usb.org上的HID Usage Tables规范中发布(第10章“键盘/小键盘页(0x 07)”)。
xfyts7mz2#
由于历史原因,Windows使用I8042扫描码进行键盘输入(API依赖于扫描码)。扫描码由Windows Keyboard HID客户端驱动程序从内部使用USB HID键盘键并调用HidP_TranslateUsagesToI8042ScanCodes生成(单向
hid usage -> scan code
表在Hidparse.lib
内部烘焙,通常不被用户代码使用。您可以找到此表为PDF here)。代码如下:
它在我的系统上给出了这个列表:
当你有一个扫描码,你可以转换扫描码到VK码通过活动键盘布局表(即嵌入在键盘布局dll文件-例如美国英语是
kbdus.dll
)。而这个VK码,你收到的WM_KEYDOWN
等消息。您可以通过调用设置了
MAPVK_VSC_TO_VK_EX (3)
标志的MapVirtualKeyEx来手动执行此scan code <-> VK code
转换。还有Windows SDK附带的
hidusage.h
。它包含一堆HID用法页面/ID,如果需要,可以在代码中作为常量使用。至于I8042扫描码和HID使用之间的高效转换-您可以使用Chromium作者的dom_code_data.inc表。下面是我的示例代码。