在哪里可以找到 Mac 虚拟键码列表?

Posted

技术标签:

【中文标题】在哪里可以找到 Mac 虚拟键码列表?【英文标题】:Where can I find a list of Mac virtual key codes? 【发布时间】:2011-03-13 06:30:16 【问题描述】:

我正在使用 CGEventCreateKeyboardEvent 并且需要知道要使用哪些 CGKeyCode 值。

具体来说,我在 Command 键的键码之后。文档给出了其他键的示例:z6shift56

某处必须有一个 Mac 虚拟键码列表?

【问题讨论】:

在这里获取我的代码:[***.com/questions/1918841/… [1]:***.com/questions/1918841/… W3C DOM Level 3 KeyboardEvent code Values @davidcondrey javascript 使用的关键代码无关。它们与 macOS 使用的虚拟键码完全不同。 【参考方案1】:

以下是供快速参考的常用键代码列表,取自Events.h

如果您需要在应用程序中使用这些键码,则应包含 Carbon 框架:

目标-C:#include <Carbon/Carbon.h>

斯威夫特:import Carbon.HIToolbox

然后您可以直接使用kVK_ANSI_A 常量。


警告

键常量引用键盘上的物理键。如果打字员使用不同的键盘布局,它们的输出会发生变化。常量中的字母仅对应于美国 QWERTY 键盘布局。

例如,homerow 上的左无名指键:

QWERTY keyboard layout > s > kVK_ANSI_S > "s"Dvorak keyboard layout > o > kVK_ANSI_S > "o"

此处讨论了与布局无关的键码到字符串的转换策略,反之亦然:

How to convert ASCII character to CGKeyCode?


来自Events.h

/*
 *  Summary:
 *    Virtual keycodes
 *  
 *  Discussion:
 *    These constants are the virtual keycodes defined originally in
 *    Inside Mac Volume V, pg. V-191. They identify physical keys on a
 *    keyboard. Those constants with "ANSI" in the name are labeled
 *    according to the key position on an ANSI-standard US keyboard.
 *    For example, kVK_ANSI_A indicates the virtual keycode for the key
 *    with the letter 'A' in the US keyboard layout. Other keyboard
 *    layouts may have the 'A' key label on a different physical key;
 *    in this case, pressing 'A' will generate a different virtual
 *    keycode.
 */
enum 
  kVK_ANSI_A                    = 0x00,
  kVK_ANSI_S                    = 0x01,
  kVK_ANSI_D                    = 0x02,
  kVK_ANSI_F                    = 0x03,
  kVK_ANSI_H                    = 0x04,
  kVK_ANSI_G                    = 0x05,
  kVK_ANSI_Z                    = 0x06,
  kVK_ANSI_X                    = 0x07,
  kVK_ANSI_C                    = 0x08,
  kVK_ANSI_V                    = 0x09,
  kVK_ANSI_B                    = 0x0B,
  kVK_ANSI_Q                    = 0x0C,
  kVK_ANSI_W                    = 0x0D,
  kVK_ANSI_E                    = 0x0E,
  kVK_ANSI_R                    = 0x0F,
  kVK_ANSI_Y                    = 0x10,
  kVK_ANSI_T                    = 0x11,
  kVK_ANSI_1                    = 0x12,
  kVK_ANSI_2                    = 0x13,
  kVK_ANSI_3                    = 0x14,
  kVK_ANSI_4                    = 0x15,
  kVK_ANSI_6                    = 0x16,
  kVK_ANSI_5                    = 0x17,
  kVK_ANSI_Equal                = 0x18,
  kVK_ANSI_9                    = 0x19,
  kVK_ANSI_7                    = 0x1A,
  kVK_ANSI_Minus                = 0x1B,
  kVK_ANSI_8                    = 0x1C,
  kVK_ANSI_0                    = 0x1D,
  kVK_ANSI_RightBracket         = 0x1E,
  kVK_ANSI_O                    = 0x1F,
  kVK_ANSI_U                    = 0x20,
  kVK_ANSI_LeftBracket          = 0x21,
  kVK_ANSI_I                    = 0x22,
  kVK_ANSI_P                    = 0x23,
  kVK_ANSI_L                    = 0x25,
  kVK_ANSI_J                    = 0x26,
  kVK_ANSI_Quote                = 0x27,
  kVK_ANSI_K                    = 0x28,
  kVK_ANSI_Semicolon            = 0x29,
  kVK_ANSI_Backslash            = 0x2A,
  kVK_ANSI_Comma                = 0x2B,
  kVK_ANSI_Slash                = 0x2C,
  kVK_ANSI_N                    = 0x2D,
  kVK_ANSI_M                    = 0x2E,
  kVK_ANSI_Period               = 0x2F,
  kVK_ANSI_Grave                = 0x32,
  kVK_ANSI_KeypadDecimal        = 0x41,
  kVK_ANSI_KeypadMultiply       = 0x43,
  kVK_ANSI_KeypadPlus           = 0x45,
  kVK_ANSI_KeypadClear          = 0x47,
  kVK_ANSI_KeypadDivide         = 0x4B,
  kVK_ANSI_KeypadEnter          = 0x4C,
  kVK_ANSI_KeypadMinus          = 0x4E,
  kVK_ANSI_KeypadEquals         = 0x51,
  kVK_ANSI_Keypad0              = 0x52,
  kVK_ANSI_Keypad1              = 0x53,
  kVK_ANSI_Keypad2              = 0x54,
  kVK_ANSI_Keypad3              = 0x55,
  kVK_ANSI_Keypad4              = 0x56,
  kVK_ANSI_Keypad5              = 0x57,
  kVK_ANSI_Keypad6              = 0x58,
  kVK_ANSI_Keypad7              = 0x59,
  kVK_ANSI_Keypad8              = 0x5B,
  kVK_ANSI_Keypad9              = 0x5C
;

/* keycodes for keys that are independent of keyboard layout*/
enum 
  kVK_Return                    = 0x24,
  kVK_Tab                       = 0x30,
  kVK_Space                     = 0x31,
  kVK_Delete                    = 0x33,
  kVK_Escape                    = 0x35,
  kVK_Command                   = 0x37,
  kVK_Shift                     = 0x38,
  kVK_CapsLock                  = 0x39,
  kVK_Option                    = 0x3A,
  kVK_Control                   = 0x3B,
  kVK_RightShift                = 0x3C,
  kVK_RightOption               = 0x3D,
  kVK_RightControl              = 0x3E,
  kVK_Function                  = 0x3F,
  kVK_F17                       = 0x40,
  kVK_VolumeUp                  = 0x48,
  kVK_VolumeDown                = 0x49,
  kVK_Mute                      = 0x4A,
  kVK_F18                       = 0x4F,
  kVK_F19                       = 0x50,
  kVK_F20                       = 0x5A,
  kVK_F5                        = 0x60,
  kVK_F6                        = 0x61,
  kVK_F7                        = 0x62,
  kVK_F3                        = 0x63,
  kVK_F8                        = 0x64,
  kVK_F9                        = 0x65,
  kVK_F11                       = 0x67,
  kVK_F13                       = 0x69,
  kVK_F16                       = 0x6A,
  kVK_F14                       = 0x6B,
  kVK_F10                       = 0x6D,
  kVK_F12                       = 0x6F,
  kVK_F15                       = 0x71,
  kVK_Help                      = 0x72,
  kVK_Home                      = 0x73,
  kVK_PageUp                    = 0x74,
  kVK_ForwardDelete             = 0x75,
  kVK_F4                        = 0x76,
  kVK_End                       = 0x77,
  kVK_F2                        = 0x78,
  kVK_PageDown                  = 0x79,
  kVK_F1                        = 0x7A,
  kVK_LeftArrow                 = 0x7B,
  kVK_RightArrow                = 0x7C,
  kVK_DownArrow                 = 0x7D,
  kVK_UpArrow                   = 0x7E
;

Macintosh Toolbox Essentials 在Figure 2-10 中说明了这些用于 Apple Extended Keyboard II 的虚拟键码的物理位置:

【讨论】:

对于可视化,请查看可用的 Macintosh Toolbox Essentials 中 Apple Extended Keyboard II 的虚拟键代码 here 值得一提的 events.h 可以在 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers 找到 电源键是哪个键码? @MichałZiobro 电源键/按钮有点棘手,它会生成多个NSSystemDefined 类型的键盘事件,这些事件具有各种键码和子类型,例如NX_POWER_KEYNX_SUBTYPE_POWER_KEY。请在 github 上查看我的 PowerKey 应用程序的源代码以获取更多信息:github.com/pkamb/PowerKey/blob/master/PowerKey/… 为什么缺少某些键,例如0x66或0x68(但0x67存在)...?【参考方案2】:

更规范的参考在<HIToolbox/Events.h>

/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h

在较新版本的 MacOS 中,“Events.h”移至此处:

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h

【讨论】:

请注意,如果您包含<Carbon/Carbon.h>(或直接包含此标头),则会暴露kVK_* 符号。所以在你的例子中,你可以直接使用kVK_Command @MattB。 +1 #include <Carbon/Carbon.h>。然后你可以输入kVK_ANSI_A 使用 Events.h 中的字符代码也适用于新的 ios7 UIKeyCommand api 在 Swift 中,import Carbon.HIToolbox 可以访问这些常量。 我在developer.apple.com 上看到 Carbon 的 HIToolbox.framework 已被弃用。但我在 Cocoa.framework 中找不到替代品。他们是否在不提供替代品的情况下弃用了这一点?在现代应用中使用这个 Carbon 框架是否安全?【参考方案3】:

找到答案here。

所以:

Command 键为 55 班次为 56 大写锁定 57 选项是 58 控制是 59。

【讨论】:

...并且archive.org 版本上的图像已损坏。 旧快照没问题(例如web.archive.org/web/20080227222056/http://classicteck.com/…)【参考方案4】:

这里是所有的键码。

这是一个表格,其中包含三个平台的一些键码。它基于美国扩展键盘布局。

http://web.archive.org/web/20100501161453/http://www.classicteck.com/rbarticles/mackeyboard.php

或者,Mac App Store 中有一个名为“Key Codes”的应用程序。下载它以查看您按下的键的键码。

密钥:https://itunes.apple.com/tr/app/key-codes/id414568915?l=tr&mt=12

【讨论】:

【参考方案5】:

除了其他答案中提供的键码外,macOS Sierra 中引入的新 API 中还有用于键重新映射的“使用 ID”:

技术说明 TN2450

在 macOS 10.12 Sierra 中重新映射键

在 macOS Sierra 10.12 下,更改了键重映射机制。本技术说明适用于关键重新映射软件的开发人员,以便他们可以更新其软件以支持 macOS Sierra 10.12。我们在本技术说明中介绍了 2 个用于为 macOS 10.12 实现密钥重映射功能的解决方案。

https://developer.apple.com/library/archive/technotes/tn2450/_index.html

Keyboard a and A - 0x04
Keyboard b and B - 0x05
Keyboard c and C - 0x06
Keyboard d and D - 0x07
Keyboard e and E - 0x08
...

【讨论】:

请注意,此表中的值与您从 NSEvent.keyCode 中得到的值不同。【参考方案6】:

我在研究LibOS 时发现了这个很棒的article。

P.S:Mac的虚拟键码最差

【讨论】:

【参考方案7】:

macOS 10.12+

自 macOS Sierra 10.12 起,keyCode 一直按照Universal Serial Bus HID Usage Tables 的要求(转到部分:10 键盘/键盘页面,第 51 页)。

Usage           Usage ID (hex)
Keyboard a and A        0x04
Keyboard b and B        0x05
Keyboard c and C        0x06
Keyboard d and D        0x07
Keyboard e and E        0x08
Keyboard f and F        0x09
Keyboard g and G        0x0A
Keyboard h and H        0x0B
Keyboard i and I        0x0C
Keyboard j and J        0x0D
Keyboard k and K        0x0E
Keyboard l and L        0x0F
Keyboard m and M        0x10
Keyboard n and N        0x11
Keyboard o and O        0x12
Keyboard p and P        0x13
Keyboard q and Q        0x14
Keyboard r and R        0x15
Keyboard s and S        0x16
Keyboard t and T        0x17
Keyboard u and U        0x18
Keyboard v and V        0x19
Keyboard w and W        0x1A
Keyboard x and X        0x1B
Keyboard y and Y        0x1C
Keyboard z and Z        0x1D
Keyboard 1 and !        0x1E
Keyboard 2 and @        0x1F
Keyboard 3 and #        0x20
Keyboard 4 and $        0x21
Keyboard 5 and %        0x22
Keyboard 6 and ^        0x23
Keyboard 7 and &        0x24
Keyboard 8 and *        0x25
Keyboard 9 and (        0x26
Keyboard 0 and )        0x27
Keyboard Return (Enter) 0x28
Keyboard Escape         0x29
Keyboard Delete (Backspace)0x2A
Keyboard Tab            0x2B
Keyboard Spacebar       0x2C
Keyboard - and _        0x2D
Keyboard = and +        0x2E
Keyboard [ and         0x2F
Keyboard ] and         0x30
Keyboard \ and |        0x31
Keyboard Non-US # and ~ 0x32
Keyboard ; and :        0x33
Keyboard ' and "        0x34
Keyboard Grave Accent and Tilde 0x35
Keyboard , and "<"      0x36
Keyboard . and ">"      0x37
Keyboard / and ?        0x38
Keyboard Caps Lock      0x39
Keyboard F1             0x3A
Keyboard F2             0x3B
Keyboard F3             0x3C
Keyboard F4             0x3D
Keyboard F5             0x3E
Keyboard F6             0x3F
Keyboard F7             0x40
Keyboard F8             0x41
Keyboard F9             0x42
Keyboard F10            0x43
Keyboard F11            0x44
Keyboard F12            0x45
Keyboard Print Screen   0x46
Keyboard Scroll Lock    0x47
Keyboard Pause          0x48
Keyboard Insert         0x49
Keyboard Home           0x4A
Keyboard Page Up        0x4B
Keyboard Delete Forward 0x4C
Keyboard End            0x4D
Keyboard Page Down      0x4E
Keyboard Right Arrow    0x4F
Keyboard Left Arrow     0x50
Keyboard Down Arrow     0x51
Keyboard Up Arrow       0x52
Keypad Num Lock and Clear   0x53
Keypad /                0x54
Keypad *                0x55
Keypad -                0x56
Keypad +                0x57
Keypad Enter            0x58
Keypad 1 and End        0x59
Keypad 2 and Down Arrow 0x5A
Keypad 3 and Page Down  0x5B
Keypad 4 and Left Arrow 0x5C
Keypad 5                0x5D
Keypad 6 and Right Arrow    0x5E
Keypad 7 and Home       0x5F
Keypad 8 and Up Arrow   0x60
Keypad 9 and Page Up    0x61
Keypad 0 and Insert     0x62
Keypad . and Delete     0x63
Keyboard Non-US \ and | 0x64
Keyboard Application    0x65
Keyboard Power          0x66
Keypad =                0x67
Keyboard F13            0x68
Keyboard F14            0x69
Keyboard F15            0x6A
Keyboard F16            0x6B
Keyboard F17            0x6C
Keyboard F18            0x6D
Keyboard F19            0x6E
Keyboard F20            0x6F
Keyboard F21            0x70
Keyboard F22            0x71
Keyboard F23            0x72
Keyboard F24            0x73
Keyboard Left Control   0xE0
Keyboard Left Shift     0xE1
Keyboard Left Alt       0xE2
Keyboard Left GUI       0xE3
Keyboard Right Control  0xE4
Keyboard Right Shift    0xE5
Keyboard Right Alt      0xE6
Keyboard Right GUI      0xE7

【讨论】:

【参考方案8】:

如果有人想输入 ansi 字符,这里有一些预先构建的 Objective-C 字典:

NSDictionary *lowerCaseCodes = @
                                @"Q" : @(12),
                                @"W" : @(13),
                                @"E" : @(14),
                                @"R" : @(15),
                                @"T" : @(17),
                                @"Y" : @(16),
                                @"U" : @(32),
                                @"I" : @(34),
                                @"O" : @(31),
                                @"P" : @(35),
                                @"A" : @(0),
                                @"S" : @(1),
                                @"D" : @(2),
                                @"F" : @(3),
                                @"G" : @(5),
                                @"H" : @(4),
                                @"J" : @(38),
                                @"K" : @(40),
                                @"L" : @(37),
                                @"Z" : @(6),
                                @"X" : @(7),
                                @"C" : @(8),
                                @"V" : @(9),
                                @"B" : @(11),
                                @"N" : @(45),
                                @"M" : @(46),
                                @"0" : @(29),
                                @"1" : @(18),
                                @"2" : @(19),
                                @"3" : @(20),
                                @"4" : @(21),
                                @"5" : @(23),
                                @"6" : @(22),
                                @"7" : @(26),
                                @"8" : @(28),
                                @"9" : @(25),
                                @" " : @(49),
                                @"." : @(47),
                                @"," : @(43),
                                @"/" : @(44),
                                @";" : @(41),
                                @"'" : @(39),
                                @"[" : @(33),
                                @"]" : @(30),
                                @"\\" : @(42),
                                @"-" : @(27),
                                @"=" : @(24)
                                ;

NSDictionary *shiftCodes = @ // used in conjunction with the shift key
                                @"<" : @(43),
                                @">" : @(47),
                                @"?" : @(44),
                                @":" : @(41),
                                @"\"" : @(39),
                                @"" : @(33),
                                @"" : @(30),
                                @"|" : @(42),
                                @")" : @(29),
                                @"!" : @(18),
                                @"@" : @(19),
                                @"#" : @(20),
                                @"$" : @(21),
                                @"%" : @(23),
                                @"^" : @(22),
                                @"&" : @(26),
                                @"*" : @(28),
                                @"(" : @(25),
                                @"_" : @(27),
                                @"+" : @(24)
                                ;

【讨论】:

使用@(42) 可以减少numberWithInteger: 42 的噪音。但是由于其他键盘布局不匹配,这样的查找表并不是一个好主意。

以上是关于在哪里可以找到 Mac 虚拟键码列表?的主要内容,如果未能解决你的问题,请参考以下文章

C#如何将虚拟键码转换为字符?

Java 键盘键码列表

我们可以在 Mac 上拥有多个张量流版本吗?

在哪里可以找到当前在 Mac 上使用 GCC 编译器的版本?

我在哪里可以找到 Mac OS X Lion 的“制作”程序?

获得虚拟键键码