Wo finde ich eine Liste der virtuellen Mac-Schlüsselcodes?

78

Ich verwende CGEventCreateKeyboardEventund muss wissen, welche CGKeyCodeWerte verwendet werden sollen.

Insbesondere bin ich nach dem Schlüsselcode für den CommandSchlüssel. Die Dokumente enthalten Beispiele für andere Schlüssel: zis 6, shiftis 56.

Muss irgendwo eine Liste der virtuellen Mac-Schlüsselcodes vorhanden sein?

Nick Moore
quelle
7
@davidcondrey Die von Javascript verwendeten Schlüsselcodes haben nichts miteinander zu tun. Sie unterscheiden sich grundlegend von den von macOS verwendeten virtuellen Schlüsselcodes.
Abenddämmerung -inaktiv-

Antworten:

76

Die kanonischere Referenz ist in <HIToolbox/Events.h>:

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

In neueren Versionen von MacOS wurde "Events.h" hierher verschoben:

/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h
Matt B.
quelle
7
Beachten Sie auch, dass <Carbon/Carbon.h>die kVK_*Symbole angezeigt werden , wenn Sie (oder diesen Header direkt) einschließen . In Ihrem Beispiel können Sie also kVK_Commanddirekt verwenden.
Matt B.
@ MattB. +1 für #include <Carbon/Carbon.h>. Sie können dann einfach eingeben kVK_ANSI_A.
pkamb
1
Die Verwendung von Zeichencodes aus Events.h funktioniert auch hervorragend für die neue UIKeyCommand-API für iOS7
Andreas Karlsson,
7
In Swift, import Carbon.HIToolboxum auf diese Konstanten zuzugreifen.
Rob Mayoff
4
Ich habe auf developer.apple.com gelesen , dass das HIToolbox.framework von Carbon veraltet ist. Aber ich kann in Cocoa.framework keinen Ersatz finden. Haben sie dies ohne Ersatz abgelehnt? Ist es sicher, dieses Carbon-Framework in modernen Apps zu verwenden?
Damiaan Dufaux
88

Unten finden Sie eine Liste der allgemeinen Schlüsselcodes zur schnellen Referenz Events.h.

Wenn Sie diese Schlüsselcodes in einer Anwendung verwenden müssen, sollten Sie das Carbon-Framework einschließen:

Ziel c:
#include <Carbon/Carbon.h>

Schnell:
import Carbon.HIToolbox

Sie können die kVK_ANSI_AKonstanten dann direkt verwenden.


WARNUNG

Die Tastenkonstanten verweisen auf physische Tasten auf der Tastatur. Ihre Ausgabe ändert sich, wenn der Schreiber ein anderes Tastaturlayout verwendet. Die Buchstaben in den Konstanten entsprechen nur dem US QWERTY-Tastaturlayout.

Zum Beispiel die linke Ringfingertaste auf der Homerow:

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

Strategien zur layoutunabhängigen Konvertierung von Schlüsselcode in Zeichenfolge und umgekehrt werden hier diskutiert:

Wie konvertiere ich ASCII-Zeichen in CGKeyCode?


Von 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 veranschaulicht die physischen Speicherorte dieser virtuellen Schlüsselcodes für das Apple Extended Keyboard II in Figure 2-10:

Virtuelle Schlüsselcodes für das Apple Extended Keyboard II

pkamb
quelle
1
Informationen zur Visualisierung finden Sie in den Codes für virtuelle Schlüssel für das Apple Extended Keyboard II in den Macintosh Toolbox Essentials, die hier verfügbar sind .
Dave
1
Erwähnenswert ist events.h unter /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers
bazz
@ MichałZiobro Die Ein- / Aus-Taste ist etwas knifflig und generiert NSSystemDefinedTastaturereignisse vom Typ mit verschiedenen Tastencodes und Untertypen wie NX_POWER_KEYund NX_SUBTYPE_POWER_KEY. PowerKeyWeitere Informationen finden Sie in der Quelle meiner App auf Github: github.com/pkamb/PowerKey/blob/master/PowerKey/…
pkamb
1
Warum fehlen einige Schlüssel wie 0x66 oder 0x68 (aber 0x67 existiert) ...?
Blaszard
18

Hier eine Antwort gefunden .

Damit:

  • Die Befehlstaste ist 55
  • Schicht ist 56
  • Feststelltaste 57
  • Option ist 58
  • Kontrolle ist 59.
Nick Moore
quelle
... und das Bild ist auf der archive.org-Version kaputt.
Casey Watson
4

Hier sind alle Schlüsselcodes.

Hier ist eine Tabelle mit einigen Schlüsselcodes für die drei Plattformen. Es basiert auf einem erweiterten US-Tastaturlayout.

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

Oder es gibt eine App im Mac App Store mit dem Namen "Key Codes". Laden Sie es herunter, um die Tastencodes der Tasten anzuzeigen, die Sie drücken.

Schlüsselcodes:
https://itunes.apple.com/tr/app/key-codes/id414568915?l=tr&mt=12

die Ex
quelle
1

Zusätzlich zu den in anderen Antworten angegebenen Schlüsselcodes gibt es in den neueren APIs, die in macOS Sierra eingeführt wurden, auch "Verwendungs-IDs", die für die Neuzuordnung von Schlüsseln verwendet werden:

Technischer Hinweis TN2450

Neuzuordnen von Schlüsseln in macOS 10.12 Sierra

Unter macOS Sierra 10.12 wurde der Mechanismus für die Neuzuordnung von Schlüsseln geändert. Dieser technische Hinweis richtet sich an Entwickler von Key Remapping-Software, damit diese ihre Software aktualisieren können, um macOS Sierra 10.12 zu unterstützen. In diesem technischen Hinweis werden zwei Lösungen zur Implementierung der Funktionen zur Neuzuordnung von Schlüsseln für macOS 10.12 vorgestellt.

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
...
pkamb
quelle
1
Beachten Sie, dass sich die Werte aus dieser Tabelle von denen unterscheiden, aus denen Sie herauskommen NSEvent.keyCode.
Austin,
0

Hier sind einige vorgefertigte Objective-C-Wörterbücher, wenn jemand Ansi-Zeichen eingeben möchte:

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)
                                };
Reece
quelle
mit @(42)reduziert den Lärm von numberWithInteger: 42. Eine solche Nachschlagetabelle ist jedoch keine gute Idee, da andere Tastaturlayouts nicht übereinstimmen.
pkamb