自定义修改 USB 键盘键位的键值功能
一、概述 目前常用的键盘键位通常为 Q、W、E、R 的键位顺序,除此之外还包括 F1 到 F12 等许多功能键,对于特殊的人群可能需要修改某个特定按键的功能,例如,在游戏中,可以修改移动、攻击的按键为自己舒适、方便的键位;程序员常用的复制(CTRL + C)、粘贴(CTRL + V),也可以放在自己喜欢的、顺手的键位位置上,快速完成复制、粘贴的功能。接下来就为大家讲解如何通过代码,修改按键的功能。
二、按键修改 1. 首先需要了解一下 USB 的 HID 类中最重要的报告描述符。报告描述符定义了 USB 设备功能的数据格式和使用方法,报告描述符中定义的数据格式是复杂且有弹性的。
例如它可以定义传输的规定格式的数据第几个字节中的第几位是什么功能;也可定义传输的数据中第一字节的第几位代表什么功能,后6个字节的一个字节代表什么功能,两种描述混合。下面以键盘常用的报告描述符来讲解一下键盘数据传输的数据格式。
① 首先前两句定义了这是一个键盘的 HID 设备; ② 定义了用途页为 Keyboard/Keypad Page,该页面包含键盘键值的 Key code 信息,具体信息可在手册《HID Usage Tables》中查阅。用到Keyboard/Keypad Page 的功能范围为 Key Codes 中的 224(0xE0) 到231(0xE7),即左 ctrl 键至右 win 键;
③ 定义数据格式为一个 bit,有八个这样的数据,由于只用一个 bit 表示功能键的工作与否,故定义的数据逻辑最大值为 1,最小值为 0。数据方向为输入,从设备到主机; ④ 定义数据格式为一个字节,有一个这样的数据,数据方向为输入,为常数,作为保留位数据; ⑤ 定义数据格式为一个字节,有六个这样的数据,由于用到的 Key Codes 为 0~101,故定义数据的逻辑最小值为 0,逻辑最大值为 101; ⑥ 定义了用途页为 Keyboard/Keypad Page,用到Keyboard/Keypad Page 的功能范围为 Key Codes 中的 0(0x00) 到101(0x65);
⑦定义数据方向为输入,从设备到主机。 这样便定义了 USB 设备与主机通信的数据格式,定义的数据格式如下表格所示。
若要在电脑上使用复制功能(left Ctrl + C),那么键盘按下 left Ctrl 和 C 键(C 键对应 Key Code 为 0x06),设备向主机发送的数据格式 01,00,06,00,00,00,00,00,这样设备便向主机发送了 left CTRL 键和 C 键按下的信号,主机执行复制功能,下表格红色对应按下的按键键码数据。
2. 自定义按键键码 在键盘中,程序内部设定好了每个键位所对应的键码,例在 A 键的键位按下,则根据规定的数据格式向主机发送 A 键键码 0x04,通过修改程序键位对应的键码,即可修改按键对应的功能。
例如,修改按键 W、S、A、D 的功能为上、下、左、右,首先在手册《HID Usage Tables》中查找上、下、左、右键码分别为:0x52、0x51、0x50、0x4F。然后在程序中,找到对应的键位映射,这里 W、S、A、D 键位映射分别对应 KeyMatrix[1][2]、KeyMatrix[2][2]、KeyMatrix[2][1]、KeyMatrix[2][3],将其原来的键码 code 修改为上、下、左、右的键码:0x52、0x51、0x50、0x4F。
最后通过矩阵键盘扫描、识别到 W、S、A、D 键的按下,通过 USB 向 PC 电脑发送数据,即可在 PC 电脑上实现相应的上、下、左、右移动功能。
三、总结 以上以键盘为例子,简单的介绍了 USB 中 HID 类设备最重要的设备描述符,并且介绍如何通过程序修改键盘键位的键值功能。
参考文档: 1、 HID Usage Tables.pdf
|