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

MacosKeyboardQuartz GraphicsKeycodeCgkeycode

Macos Problem Overview


I'm using CGEventCreateKeyboardEvent and need to know what CGKeyCode values to use.

Specifically, I am after the key code for the Command key. The docs give examples for other keys: z is 6, shift is 56.

There must be a list of Mac virtual keycodes somewhere?

Macos Solutions


Solution 1 - Macos

Below is a list of the common key codes for quick reference, taken from Events.h.

If you need to use these keycodes in an application, you should include the Carbon framework:

Objective-C:
#include <Carbon/Carbon.h>

Swift:
import Carbon.HIToolbox

You can then use the kVK_ANSI_A constants directly.


WARNING

The key constants reference physical keys on the keyboard. Their output changes if the typist is using a different keyboard layout. The letters in the constants correspond only to the U.S. QWERTY keyboard layout.

For example, the left ring-finger key on the homerow:

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

Strategies for layout-agnostic conversion of keycode to string, and vice versa, are discussed here:

https://stackoverflow.com/questions/1918841/how-to-convert-ascii-character-to-cgkeycode


From 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 illustrates the physical locations of these virtual key codes for the Apple Extended Keyboard II in Figure 2-10:

Virtual key codes for the Apple Extended Keyboard II

Solution 2 - Macos

The more canonical reference is in <HIToolbox/Events.h>:

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

In newer Versions of MacOS the "Events.h" moved to here:

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

Solution 3 - Macos

Found an answer here.

So:

  • Command key is 55

  • Shift is 56

  • Caps Lock 57

  • Option is 58

  • Control is 59.

Solution 4 - Macos

Here are the all keycodes.

> Here is a table with some keycodes for the three platforms. It is based on a US Extended keyboard layout.

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

Or, there is an app in the Mac App Store named "Key Codes". Download it to see the keycodes of the keys you press.

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

Solution 5 - Macos

In addition to the keycodes supplied in other answers, there are also "usage IDs" used for key remapping in the newer APIs introduced in macOS Sierra:

> Technical Note TN2450 > > Remapping Keys in macOS 10.12 Sierra > > Under macOS Sierra 10.12, the mechanism for key remapping was changed. This Technical Note is for developers of key remapping software so that they can update their software to support macOS Sierra 10.12. We present 2 solutions for implementing key remapping functionality for macOS 10.12 in this Technical Note. > > 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
...

Solution 6 - Macos

I found this wonderful article while doing the research for LibOS.

enter image description here

P.S: Mac's virtual key codes are the worst

Solution 7 - Macos

macOS 10.12+

Since macOS Sierra 10.12, keyCode has been according to the Universal Serial Bus HID Usage Tables (go to section: 10 Keyboard/Keypad Page, page 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 {		0x2FKeyboard ] 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

Solution 8 - Macos

Here's some prebuilt Objective-C dictionaries if anyone wants to type ansi characters:

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)
                                };

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNick MooreView Question on Stackoverflow
Solution 1 - MacospkambView Answer on Stackoverflow
Solution 2 - MacosmbaumanView Answer on Stackoverflow
Solution 3 - MacosNick MooreView Answer on Stackoverflow
Solution 4 - Macosthe_exclusiveView Answer on Stackoverflow
Solution 5 - MacospkambView Answer on Stackoverflow
Solution 6 - Macosgavrilikhin.dView Answer on Stackoverflow
Solution 7 - MacosSverrissonView Answer on Stackoverflow
Solution 8 - MacosReeceView Answer on Stackoverflow