Where can I find a list of Mac virtual key codes?

101
我正在使用CGEventCreateKeyboardEvent,需要知道要使用哪些CGKeyCode值。
具体来说,我需要找到Command键的代码。文档提供了其他按键的示例:z6shift56
一定有一个Mac虚拟键代码清单吧?

获取我的代码,请点击此链接:[https://dev59.com/h3I-5IYBdhLWcg3wTWj4#14529841] - TONy.W
7
Javascript使用的关键代码与macOS使用的虚拟键代码没有关联,两者完全不同。 - user149341
8个回答

115
以下是常见的按键码清单,供快速参考,取自Events.h
如果您需要在应用程序中使用这些按键码,则应包括Carbon框架:
Objective-C:
#include <Carbon/Carbon.h> Swift:
import Carbon.HIToolbox 然后,您可以直接使用kVK_ANSI_A常量。

警告

键值常量引用键盘上的物理按键。如果打字者使用不同的键盘布局,则它们的输出会更改。常量中的字母仅对应于美国QWERTY键盘布局。

例如,主键区域上的左手无名指键:

QWERTY键盘布局 > s > kVK_ANSI_S > "s"
Dvorak键盘布局 > o > kVK_ANSI_S > "o"

在此处讨论了将键码转换为字符串及其反向操作的与布局无关的策略:

如何将ASCII字符转换为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 阐述了苹果扩展键盘 II 虚拟按键码的物理位置,如 图2-10 所示:

Virtual key codes for the Apple Extended Keyboard II


1
为了可视化,请查看Macintosh Toolbox Essentials中提供的Apple Extended Keyboard II的虚拟键代码,链接在此处:https://web.archive.org/web/20160509091827/http://x86osx.com/bbs/c_data/pds_comment/MacintoshToolboxEssentials.pdf。 - Dave
1
值得一提的是,events.h 可以在 /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers 找到。 - bazz
电源按钮的键码是哪个? - Michał Ziobro
@MichałZiobro 电源键/按钮有点棘手,会生成几个NSSystemDefined类型的键盘事件,包括各种按键码和子类型,例如NX_POWER_KEYNX_SUBTYPE_POWER_KEY。更多信息请参见我在GitHub上的PowerKey应用程序源代码:https://github.com/pkamb/PowerKey/blob/master/PowerKey/PKPowerKeyEventListener.m - pkamb
2
为什么某些键丢失了,如0x66或0x68(但是0x67存在)...? - Blaszard
1
为什么这些静态常量不在Event类上? - 1.21 gigawatts

81

更为标准的参考文献在<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

8
请注意,如果您包含<Carbon/Carbon.h>(或直接包含此头文件),则会公开kVK_*符号。因此,在您的示例中,您可以直接使用kVK_Command - mbauman
@MattB。对于#include <Carbon/Carbon.h>给予加1。然后你可以直接输入kVK_ANSI_A - pkamb
1
使用Events.h中的字符代码在新的iOS7 UIKeyCommand API中非常有效。 - Andreas Karlsson
7
在Swift中,使用import Carbon.HIToolbox来访问这些常量。 - rob mayoff
6
我在 developer.apple.com 上读到,Carbon 的 HIToolbox.framework 已被弃用。但我在 Cocoa.framework 中找不到替代品。他们是否在没有提供替代品的情况下将其弃用? 在现代应用程序中使用这个 Carbon framework 安全吗? - Damiaan Dufaux

19

在这里找到了答案

所以:

  • Command键是55
  • Shift键是56
  • Caps Lock键是57
  • Option键是58
  • Control键是59。

...并且在archive.org版本中,图片已经损坏。 - Casey Watson
在旧的快照上没问题(例如https://web.archive.org/web/20080227222056/http://classicteck.com/rbarticles/mackeyboard.php) - gavrilikhin.d

7

6

我在为 LibOS 进行研究时,发现了这篇很棒的文章

enter image description here

附言:Mac的虚拟按键码最糟糕。


我正在尝试使用F8来播放或暂停系统正在使用的任何内容。有人知道如何实现吗? - loco.loop
“快捷方式”和“按键码”的区别在于,快捷方式是用户需要记住的,而按键码则是不会改变的。这样一来,一个按键可以在不同的布局中输出不同的字母。这并不是“最糟糕”的,而是有其目的。例如:位于最左侧Shift键右侧的按键可以是“W”、“Z”、“>”等等...但它始终具有相同的按键码,因此通过按键码请求字母,结果会根据用户的布局选择相应的字母。 - undefined

1
除了其他答案中提供的按键代码外,还有在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
...

1
请注意,这个表的值与从“NSEvent.keyCode”获得的值不同。 - Austin

0

如果有人想输入 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的噪音。但是,这样的查找表在其他键盘布局上可能会出现不匹配的问题,因此并不是一个好主意。 - pkamb

0

macOS 10.12+

自从 macOS Sierra 10.12 版本以来,keyCode 已经按照 通用串行总线 HID 使用表(转到第 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

显然,这些代码不适用于macOS Ventura(13)。 - loco.loop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接