Der virtuelle Tastencode ist genau nicht basierend auf dem Tastaturlayout des Benutzers. Es zeigt an, welche Taste gedrückt wurde, nicht, welches Zeichen dieser Schlüssel erzeugt oder wie es beschriftet ist.
Zum Beispiel kVK_ANSI_A
(von Kohlenstoff/HIToolbox/Events.h, Wert 0x00
) nicht nicht den Schlüssel bedeuten, die die ‚A‘ Zeichen erzeugt, bedeutet dies, den Schlüssel, der in der Lage ist, dass die ‚A‘ Schlüssel befindet sich in einer ANSI-Standardtastatur. Wenn ein französisches Tastaturlayout aktiv ist, erzeugt diese Taste 'Q'. Wenn die physische Tastatur eine französische Tastatur ist, wird diese Taste wahrscheinlich ebenfalls mit "Q" beschriftet.
So ist der virtuelle Schlüsselcode eine Art Scan-Code, aber von einer idealisierten Standardtastatur. Es ist, wie erwähnt, hardwareunabhängig. Es ist auch unabhängig von der Tastaturbelegung.
Um vom virtuellen Schlüsselcode in ein Zeichen zu übersetzen, können Sie UCKeyTranslate()
verwenden. Sie benötigen die 'uchr'-Daten für das aktuelle Tastaturlayout. Sie können das mit TISCopyCurrentKeyboardLayoutInputSource()
und dann TISGetInputSourceProperty()
mit kTISPropertyUnicodeKeyLayoutData
als den Eigenschaftenschlüssel erhalten.
Sie benötigen auch den Tastaturcode. Ich glaube, es wird immer noch unterstützt, LMGetKbdType()
zu verwenden, um das zu bekommen, obwohl es nicht mehr dokumentiert ist außer im Legacy-Abschnitt. Wenn Sie das nicht möchten, können Sie ein CGEvent
vom NSEvent
erhalten, erstellen
ein
CGEventSource
von diesen mit
CGEventCreateSourceFromEvent()
und dann
CGEventSourceGetKeyboardType()
verwenden und CGEventGetIntegerValueField()
mit kCGKeyboardEventKeyboardType
rufen Sie den Tastaturtyp zu erhalten.
Natürlich ist es viel einfacher zu -[NSEvent characters]
oder -[NSEvent charactersIgnoringModifiers]
einfach zu verwenden. Oder, wenn Sie eine Textansicht implementieren, senden Sie Key-Down-Ereignisse an -[NSResponder interpretKeyEvents:]
(wie in Cocoa Event Handling Guide: Handling Key Events diskutiert) oder -[NSTextInputContext handleEvent:]
(wie in Cocoa Text Architecture Guide:Text Editing diskutiert). Diese werden entweder mit der entsprechenden Aktionsauswahl, wie moveBackward:
, oder mit -insertText:
zur Ansicht zurückkehren, wenn der Tastenanschlag (im Kontext der letzten Ereignisse und der Eingabequelle) Text erzeugen würde.
Ah, danke für die Erklärung der virtuellen Tastencodes aus der Mac-Perspektive, es scheint sich von Windows zu unterscheiden. Es scheint am einfachsten zu sein, CharacterIgnoringModifiers für Charaktere zu testen, die meine App interessieren. – NateS