General2026-07-21

我键盘的秘密代码——发现你从未知道的按键码

我在键盘上按了一个键,得到了一个数字,这个数字开启了一个关于隐藏按键码的兔子洞。有些甚至没有对应的物理按键。

我正在为一个小型 web 应用构建一个键盘快捷键功能。一个小工具。按一个键,捕获按键码,映射到一个操作。我快速写了一个 keydown 事件监听器,把 event.code 和 event.key 记录到控制台。按了字母 J。得到 74。按了 Enter。得到 13。常规操作。

然后,出于好奇,我按了 Pause 键——那个在 Print Screen 和 Scroll Lock 之间落灰的键,我这辈子从没有意碰过。它返回了 19。我按了 Scroll Lock。又一个我从没见过的数字。突然我开始按键盘上的每个键,像破译古代密码一样写下数字。

这就是我掉进按键码世界的方式,它比我想象的有趣得多。

我学到的第一件事是物理按键和它产生的字符之间有区别。event.key 给你字符——"a"、"b"、"1"、"!"——基于实际输入的内容。event.code 给你键盘上的物理按键位置,比如 "KeyA" 或 "Digit1",不管你按了什么修饰键。按 Shift+1 会给你 event.key 为 "!" 但 event.code 始终是 "Digit1"。

这个区别比我意识到的要重要得多。如果你在构建键盘快捷键,你几乎总是想要 event.code,因为它与用户的语言布局无关。德语键盘的字母位置与美国键盘不同,但按键的物理位置保持不变。

然后我发现了那些在大多数键盘上根本不存在的键。有一个 "Close" 的键码——一些键盘上的 X 按钮。有一个 "Mail" 键码可以打开默认邮件客户端。"Calculator" 启动计算器应用。"Sleep" 让电脑休眠。这些是很多键盘都包含但大多数开发者从不处理的媒体和特殊功能键。

F12 之后的功能键是一个启示。F13 到 F24 存在。我从未见过带 F13 的键盘,但键码就在那里。它们是为了与具有 F13 到 F24 物理按键的旧终端键盘的向后兼容性而存在。这些代码仍然在规范中。

然后还有修饰键组合。同时按住 Ctrl、Alt 和 Shift 并按一个字母,会给你一个完全不同于单独按那个字母的键码路径。浏览器的 event 对象也能区分左右修饰键——event.ctrlKey 与仅仅检查 control 是否被按下不同。左 Shift 和右 Shift 是不同的物理按键,你可以单独检查它们。

我建了一个小工具,在我打字时实时显示每个键码。现在它作为一个书签放在我的浏览器栏里。每当我需要映射一个新快捷键时,我打开它,按我想用的组合键,然后复制代码。不再需要猜测是 "Comma" 还是 "«" 还是 188。

说实话,最好玩的部分只是按随机键然后看着数字出现。Pause 键每次都让我会心一笑。