1.键盘扫描码
键盘上的数据主要以扫描代码的形式出现,这些扫描代码由按键产生或在计算机协议中使用。( 键盘固件在内部使用了不同的代码,并且还存在几 组扫描代码。在本节中,我们仅讨论默认代码-来自转换后的扫描代码集2的默认代码。下面讨论一些不太常见的模式 。)每次按键和释放键会产生0到6个扫描码。
1.1密钥发布
下面我仅提及按键的扫描代码(“ make”)。通过设置高位(加0x80 = 128)可以从中获得密钥释放(“ break”)的扫描代码。因此,Esc印刷机产生扫描码01,Esc释放扫描码81(十六进制)。对于序列,情况相似:键盘-/ 按下时给出e0 35,释放时给出e0 b5。重复按键时,大多数键盘会重复输入代码(按键代码)。有些人还会在重复过程中伪造Shift down和Shift up事件。
PrtSc / SysRq和Pause / Break键是特殊的。 当没有同时按下修饰键时,前者生成扫描代码e0 2a e0 37,e0 37 与Shift或Ctrl 一起按下,但54与(左或右)Alt一起出现。(并且在释放时获得了预期的序列。但是请参见 下文。)后者 在按下时(不带修饰符)会产生扫描码序列 e1 1d 45 e1 9d c5,而在释放时则什么也没有。但是,连同(左或右)Ctrl一起,将得到 e0 46 e0 c6,在释放时也没有任何结果。它不会重复。
有关具有不同行为的键的报告,请参见 下文。
有许多关于笔记本电脑键击事件严重反弹的报告。因此,意外的按键事件可能应该被认为是不寻常的,并且可以忽略。没有提前按下键盘按键事件的另一个来源可能是 假班次。
1.2协议扫描码
大多数扫描代码表示按键或释放。一些在通讯协议中使用。
00 | 键盘错误-见ff |
a | BAT(基本保证测试)确定 |
ee | echo命令的结果 |
f1 | 一些键盘,作为对命令a4的答复:未安装密码 |
F A | 来自kbd的确认 |
fc | BAT错误或鼠标传输错误 |
fd | 内部故障 |
FE | 键盘无法确认,请重新发送 |
ff | 键盘错误 |
键盘错误的三个常见原因是:(i)同时按下多个键;(ii)键盘缓冲区溢出;(iii)键盘和键盘控制器用于通讯的串行线上的奇偶校验错误。报告的错误是FF在 扫描码模式 1,和00在扫描码模式2和3。如果翻译是,既00和FF 被翻译为FF。
通常,这些代码具有协议含义。但是,它们也以实际的扫描代码出现,尤其是在以e0为前缀的情况下。
1.3转义扫描码
代码e0和e1引入了扫描代码序列,通常不单独用作隔离的扫描代码(但请参见 下文)。
(前缀e0最初用于原始PC / XT键盘上的键的灰色重复。如今,e0仅用于扩展代码空间。用于暂停/中断的前缀e1表示此键发送通/断序列在发布时,并且在发布时不执行任何操作。)
此,与上述情况,意味着该值 00,60,61,图6e,71, 图7a,图7c,图7E,图7F 是不可用的,以表示按键(默认键盘上)。尽管如此,它们也以扫描代码的形式出现,例如,参见下面的 Telerate和 Safeway SW23键盘。
其他前缀也会出现,请参见 下文。
Logitech将e2前缀用于键盘上集成的定点设备发送的代码。
1.4普通扫描码
转换后的扫描码集2中的扫描码以十六进制表示。括号之间是美式键盘上的键帽。扫描代码是按顺序给出的,并根据通常彼此相邻的一组密钥进行分组。
00通常是错误代码
01(Esc)
02(1!),03(2 @),04(3#),05(4 $), 06(5%E),07(6 ^),08(7&), 09(8 *),0a( 9(),0b(0)),0c(-_), 0d(= +),0e(退格键)
0f(Tab),10(Q),11(W),12(E), 13(R),14(T),15(Y), 16(U),17(I),18(O), 19(P),1a([{),1b(]})
1c(输入)
1d(LCtrl)
1e(A),1f(S),20(D),21(F), 22(G),23(H),24(J),25(K), 26(L),27(; 🙂 ,28(’“)
29(`〜)
2a(左移)
2b(\ |),在102键键盘上
2c(Z),2d(X),2e(C),2f(V), 30(B),31(N),32(M),33(,<), 34(。>),35(/ ?),36(RShift)
83/84键键盘上的37(键盘-*)或(* / PrtScn)
38(LAlt),39(空格键),
3a(大写锁定)
3b(F1),3c(F2),3d(F3),3e(F4), 3f(F5),40(F6),41(F7), 42(F8),43(F9),44(F10)
45(NumLock)
46(滚动锁定)
47(键盘7 / Home),48(键盘8 / Up), 49(键盘9 / PgUp)
4a(键盘-)
4b(小键盘4 /左),4c(小键盘5), 4d(小键盘6 /右),4e(小键盘- +)
4f(键盘-1 /结束),50(键盘-2 /下), 51(键盘-3 / PgDn)
52(键盘-0 / 插入),53(键盘-./Del)
84 +键盘上的54(Alt-SysRq)
55不太常见;例如,在Cherry G80-0777键盘上为F11,在Telerate键盘上为F12,在Focus 9000键盘上为PF1,在IBM ThinkPad上为FN。
56个主要在非美国键盘上使用。它通常是 左Alt键左侧 或 右侧的未标记 键。
101+键键盘上的57(F11),58(F12)
59 – 5A -…- 1408米是不太常见的。分配基本上是随机的。扫描码55 – 59发生的对F11-F15 樱桃G80-0777键盘。扫描码59 – 5C上出现 RC930键盘。X呼叫5d的 `KEY_Begin’。扫描码61 – 64出现上 德励键盘。扫描码55,6D,6F,73,74, 77,78,79,图7aFocus 9000键盘上出现 ,7b, 7c,7e。扫描码65,67,69,图6b 一个上发生 康柏阿马达键盘。扫描码66 – 68,73发生上 樱桃G81-3000键盘。扫描码70,73,79,图7b,图7d 一个上发生 日本一百零六分之八十六键盘。
扫描代码f1和f2出现在 韩文键盘上。
1.5转义的扫描码
除了具有以e1开头的转义序列的Pause / Break键之外,使用的转义键是e0。通常,以这样一种方式选择代码:当接收方只是丢弃e0时,会发生一些有意义的事情。
e0 1c(键盘输入) | 1c(输入) | |
e0 1d(RCtrl) | 1d(LCtrl) | |
e0 2a(假LShift) | 2a(左移) | |
e0 35(键盘-/) | 35(/?) | |
e0 36(假RShift) | 36(右移) | |
e0 37(Ctrl-PrtScn) | 37(* / PrtScn) | |
e0 38(倾斜) | 38(升) | |
e0 46(Ctrl-Break) | 46(滚动锁定) | |
e0 47(灰色之家) | 47(键盘7 / Home) | |
e0 48(灰色) | 48(小键盘8 /向上箭头) | |
e0 49(灰色PgUp) | 49(小键盘9 / PgUp) | |
e0 4b(左灰色) | 4b(小键盘4 /左) | |
e0 4d(灰色右) | 4d(键盘6 /右) | |
e0 4f(灰底) | 4f(小键盘-1 /结束) | |
e0 50(灰暗) | 50(键盘2 /向下箭头) | |
e0 51(灰色PgDn) | 51(键盘3 / PgDn) | |
e0 52(灰色插入) | 52(键盘-0 /插入) | |
e0 53(灰色删除) | 53(键盘-./Del) | |
这些转义的扫描代码仅在101+键键盘上发生。在 微软键盘增加
e0 5b(左窗) |
e0 5c(RightWindow) |
e0 5d(菜单) |
还会发生其他转义的扫描代码-请参见下面各个键盘下的内容。
1.6假班次
十个灰色键Insert,Home,PgUp,Delete,End,PgDn,Up,Left,Down,Right均应起作用,而与Shift和NumLock键的状态无关。但是对于旧的AT键盘,当Numlock打开或Shift按下时,键盘键会产生数字。因此,为了欺骗旧程序,将发送伪造的扫描代码:当LShift按下并按下Insert键时,发送e0 aa e0 52;释放插入e0 d2后, 将发送e0 2a。换句话说,将插入伪造的LShift-up和伪造的LShift-down。
如果Shift键早于重复键被释放,则会出现一个真正的Shift-up代码(之前没有伪造的Shift-down),因此忽略e0的程序将比Shift-down看到更多的Shift-up。
启用NumLock时,在Shift按下时不会发送任何虚假的Shift,但是在Shift没按下时不会发送假的Shift。因此,使用Numlock时,如果按下Insert键, 则发送e0 2a e0 52,并在释放e0 d2后 发送e0 aa。键盘保持专用的NumLock模式,在按下NumLock时切换,并在设置NumLock LED时设置。
以相同的方式,当Shift向下时,Grey- /键会产生伪Shift-up和伪Shift-down序列。但是,它不会对NumLock的状态作出反应。当然,这样做的目的是使将Grey- /标识为普通/的程序变得愚蠢,这样它们就不会像Shift- /一样将Shift-Grey- /当作对待。
在Toshiba笔记本电脑上,三个Windows按键的处理方式与前面提到的十个按键的处理方式相同,当Shift(向下或向右)移动时,会得到假的转换。他们不会对NumLock做出反应。
1.7添加了非假班次
在我的121键 诺基亚数据键盘上,有功能键F1,…,F24,其中F1,…,F12发送期望的代码3b,…,58和F13,…,F24发送期望的代码 。相同的代码以及LShift代码2a。因此,F13 在按下时给出2a 3b,在释放时给出bb aa。同样,有些键具有添加的LCtrl代码1d。但是也有一些密钥带有伪造的班次e0 2a。
Delorie 报告说,带有其他F11-F22键的“ Preh Commander AT”键盘将F11-F20视为Shift-F1..Shift-F10和F21 / F22视为Ctrl-F1 / Ctrl-F2;具有F11-F24键的Eagle PC-2键盘以相同的方式处理这些其他键。
1.8 Turbo模式
在某些主板上,LCtrl-LAlt-GreyPlus和LCtrl-LAlt-GreyMinus分别打开/关闭Turbo模式。对于这些,按下Turbo按钮时母板可能会生成相同的扫描码序列:Turbo开关(高→低): 1d 38 4a ce b8 9d 和Turbo开关(低→高): 1d 38 4e ce b8 9d。
这种样式的其他特殊组合包括LCtrl-LAlt-LShift-GreyMinus和LCtrl-LAlt-LShift-GreyPlus,以关闭/打开系统缓存。
如果在AMIBIOS Setup中启用了Green PC系统节能模式,则AMI MegaKey键盘控制器会识别以下组合:Ctrl-Alt-\(将系统置于立即掉电模式),Ctrl-Alt-[(禁用Green PC节能模式)临时),Ctrl-Alt-](启用绿色PC关机模式)。
Thio Yu Jin < jin@singmail.com
>抱怨说,在他的Toshiba 4010CDS上,Ctrl-Alt-Shift-T组合键弹出了Toshiba用户手册。(1999年3月4日-不是4月1日。)
1.9省电
Microsoft建议:“基于i8042的键盘应为电源管理按钮(即POWER和SLEEP按钮)部署以下扫描代码:
第1组通/断 | 第2组通/断 | |
功率 | e0 5e / e0 de | e0 37 / e0 f0 37 |
睡觉 | e0 5f / e0 df | e0 3f / e0 f0 3f |
唤醒 | e0 63 / e0 e3 | e0 5e / e0 f0 5e |
“电源”,“睡眠”和“唤醒”事件扫描代码与i8042等效,相当于“系统关机,系统睡眠和系统唤醒HID的用法”。
许多键盘具有电源/睡眠/唤醒键,这些键必须由第四个键(未标记或标记为FN)激活:按下这四个键之一不会产生任何扫描代码,但是同时按下FN键时,电源/睡眠/唤醒键提供上面列出的代码。
1.10初始化特殊键盘
许多键盘具有比标准键盘更多的键和按钮。有时,这些附加键会产生以前未使用过的扫描码组合。但是,在其他键盘上,此类附加键根本不会产生任何代码,直到采取一些初始化措施为止。
有时,该操作包括将一些字节写入键盘寄存器。例如,请参阅 IBM Rapid Access键盘和 Omnibook键盘。
1.11操纵额外的LED
一些键盘具有附加的LED,在某些情况下,我们知道如何操作这些LED。
的 群光键盘需要的命令序列 EB 00 的xy,与 XY = 01为月球LED和 XY = 02为ZZZ LED。
在 IBM EZ按钮键盘需要的命令序列EB 00 的xy,与 XY = 01为Msg灯, XY = 02为CD LED, XY = 04的电源LED, XY = 10用于通话LED,和 XY = 20为消息等待指示灯。
的 IBM快速访问键盘需要的命令序列EB 00 的xy,与 XY = 04的挂起LED和 XY = 20为静音LED。
的 IBM快速访问键盘II所需要的命令序列EB 71和EB 70 切换待机LED打开和关闭。
在 罗技Internet键盘 有一个额外的琥珀色LED。通过发送eb将其打开,然后大约每秒闪烁一次。ec再次将其关闭。
1.12笔记本电脑FN键
笔记本电脑无法容纳通常在普通键盘上找不到的所有无意义的键。因此,数字键盘和其他键被折叠到键盘的主要部分中。没有标签或带标签的FN的密钥通常用于修改其他密钥的含义。该FN本身不会产生扫描代码,它只会修改其他键产生的扫描代码。
尼尔·布朗(Neil Brown)报告了有关他的戴尔Latitude D800笔记本电脑的信息,该笔记本电脑有五个按键组合,无法产生正确的中断代码。FN + F2,FN + F3,FN + F10,FN + Down,FN + Up(标记为Wireless,Brighter,Darker,Battery,CDEject)的五个组合产生了制造代码e0 08,e0 07, e0 09,e0 05,e0 分别为06。前三个不会产生任何中断代码。最后两个具有与make代码相同的中断代码。