我在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 0x2a
和0xe0 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
我相信这可以防止你所描述的冲突。