在Linux中,4字节扫描码是如何映射到密钥码的



我在Debian Buster中摆弄扫描码和密钥码,发现了一些奇怪的东西。

使用sudo showkey -s,我发现USB有线键盘的PrintScreen/SysRq键的扫描码是

0xe0 0x2a 0xe0 0x37 0xe0 0xaa 0xe0 0xb7

也就是说,0xe0 0x2a 0xe0 0x37是按压它的代码,0xe0 0xaa 0xe0 0xb7是释放它的代码

我的第一个问题是:为什么它使用两个扫描码(0xe0 0x2a0xe0 0x37(?这难道与其他扫描码不冲突吗?使用未使用的扫描码不是更明智吗?

使用sudo showkey -k,我发现PrintScreen/SysRq与内核密钥代码99相关联,但当我运行sudo getkeycodes时,没有X密钥代码107的条目。

sudo getkeycodes的输出为

Códigos de varredura planos xx (hex) versus códigos de teclas (dec)
0 é um erro; para 1-88 (001-0x58) código de varredura igual a código de tecla
0x58:   88   -   -   - 185 238   -   -
0x60:    -   -   -   -   -   -   -   -
0x68:    -   -   - 191   -   -   -   -
0x70:    -   -   -   -   -   -   -   -
0x78:    -   -   -   -   -   -   -   -
Códigos de varredura escapados e0 xx (hex)
e0 00:    -   - 212 533   -   -   -   -
e0 08:  238   -   -   -   -   -   -   -
e0 10:    -   -   -   -   -   -   -   -
e0 18:    -   -   -   -   -   -   -   -
e0 20:    -   -   -   -   -   -   -   -
e0 28:    -   -   -   -   -   -   -   -
e0 30:    -   -   -   -   -   -   -   -
e0 38:    -   -   -   -   - 212   -   -
e0 40:    -   -   -   -   -   -   -   -
e0 48:    -   -   -   - 227   -   -   -
e0 50:    -   -   -   -   -   -   -   -
e0 58:    -   -   -   -   -   -   -   -
e0 60:  148 184   -   - 171   -   -   -
e0 68:  152 431   - 534 535 536 537 538
e0 70:    -   -   - 139   - 172   1   -
e0 78:    -   -   -   -   -   -   -   -

我的第二个问题是:如果上面的输出中没有条目,那么PrintScreen/SysRq从扫描码到键码的映射是如何工作的?

如有必要,我可以提供任何其他信息。

提前谢谢大家。

第1版:我意识到这种扫描代码组合与按下Shift+ (Ctrl-PrtScn)相冲突,我通过运行sudo showkey -s确认了Shift的扫描代码是0x2a 0xaa,并在本文档中找到了(Ctrl-PrtScn)的代码。

我在/usr/lib/udev/hwdb.d/60-keyboard.hwdb上搜索了这张地图,但什么也没找到。

您在编辑中发布的文档实际上为您的大多数问题提供了答案。

PrtSc扫描码是否会与其他按键产生的序列混淆

PrtSc是产生多个扫描代码的两个键之一。另一种是暂停/中断(参见[1]中的第1.1节(。分析扫描代码流的键盘驱动程序会知道某些键会产生几个扫描代码。因此,如果需要,它会等待几个扫描码到达,然后将它们与已知的组合进行匹配。

还有另一组扫描代码,即set 3(请参见[2](,它为每个键使用唯一的扫描代码,从而简化了扫描代码流的解析。但它并没有被接受。

为什么在我的getkeycodes输出中没有PrtSc条目

也许你玩了setkeycodes并把它去掉了?

注意,getkeycodes显示的是内核密钥码,而不是X密钥码(正如您正确指出的那样,它等于内核kyecode+8(。所以,你应该寻找99而不是107。

X键代码可以在例如/usr/share/X11/xkb/keycodes/evdev中查找

PrtSc和Shift+Ctrl+PrtSc的扫描码冲突

PrtSc的特殊之处还在于,它根据按下的修改键产生不同的扫描代码(参见[1]中的第1.1节(:

  • PrtSc产生e0 2a e0 37
  • PrtSc与Shift或Ctrl一起生成e0 37
  • PrtSc与Alt一起产生54

我相信这可以防止你所描述的冲突。

最新更新