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

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

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

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

【问题讨论】:

标签: macos keyboard quartz-graphics keycode cgkeycode


【解决方案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 EssentialsFigure 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。

【讨论】:

【解决方案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 的噪音。但是由于其他键盘布局不匹配,这样的查找表并不是一个好主意。
        猜你喜欢
        • 1970-01-01
        • 2010-12-10
        • 2022-10-07
        • 1970-01-01
        • 1970-01-01
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多