我想确认 PC 类型计算机上的键盘是否在本地控制 NUM_LOCK LED,或者计算机系统软件是否根据从键看到的扫描码向键盘发送命令来管理此 LED Num Lock。
我之所以问这个问题,是因为我最近在用一个单独的 USB 数字键盘做一些实验,发现当Num Lock按下它的按钮时,虽然它的 NUM_LOCK LED 亮了,但当时没有 NUM_LOCK 扫描代码发送到计算机。使用基于在线浏览器的键盘测试,我发现这个奇怪的键盘在 NumLock 模式下会为其他每个键盘键发送以下内容::Numlock 向下扫描代码 - 数字按钮向下扫描代码 - 数字按钮向上扫描代码 - Numlock 向上扫描代码。
Num Lock在相同的键盘测试中,我的常规键盘在按下和释放按钮时会发送 NumLock Down 然后发送 NumLock Up 扫描代码。
为什么这个 USB 键盘的工作方式与普通键盘不同?
答案1
PC 主机负责将 LED 状态发送到键盘,键盘本身负责保存最后设置的 LED 状态。在 Windows 中,LED 状态由键盘驱动程序更新,以与VK_CAPITAL/VK_NUMLOCK/VK_SCROLL/VK_KANA 虚拟键代码当前线程的状态。
现代键盘通过HID 1.11 的设备类定义(USB HID 规格)。蓝牙键盘也在底层使用这个规格。
根据附录 C:键盘实现规格:
LED 状态与 CAPS LOCK、NUM LOCK、SCROLL LOCK、COMPOSE 和 KANA 事件之间的同步由主机维护而不是键盘。如果使用附录 B 中的键盘描述符,则通过 Set_Report(输出)请求向键盘发送 5 位绝对报告来设置 LED 状态。
根据B.1 协议 1(键盘)的附录 B:启动接口描述符”:
下表表示键盘输出报告(1个字节)。
少量 | 描述 |
---|---|
0 | 数字键盘(的第一个键 |
1 | 大写锁定 |
2 | 滚动锁定 |
3 | 撰写 |
4 | 假名 |
5 至 7 | 持续的 |
注意:LED 是绝对输出项。这意味着每个 LED 的状态都必须包含在输出报告中(0 = 关闭,1 = 开启)。相对项将允许仅影响选定控件的报告(0 = 无变化,1 = 变化)。