2013-08-23 9 views
6

NSEvent keyCode gibt einen Tastatur-Scancode, bei dem es sich um einen hardwarespezifischen Code handelt, der den physischen Schlüssel darstellt. Ich möchte den Scan-Code in einen virtuellen Schlüsselcode umwandeln, bei dem es sich um den logischen Schlüssel handelt, der auf dem Tastaturlayout des Benutzers basiert (QWERTY, AZERTY usw.).Karte NSEvent keyCode zu virtuellem Schlüsselcode

In Windows kann ich dies über MapVirtualKey tun. Was ist das OS X-Äquivalent?

Antwort

16

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.

+0

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

1

Gemäß der NSEvent-Dokumentation gibt -[NSEvent keyCode] den hardwareunabhängigen virtuellen Schlüsselcode zurück.

+0

Hmm, du hast Recht, aus irgendeinem Grund lese ich das als Hardware-abhängig, denke ich, denn das scheint das Verhalten in meiner App zu sein. Ich schätze, ich habe mehr Nachforschungen zu tun. Nichts zu sehen hier, weitermachen ... – NateS

Verwandte Themen