2013-08-23 14 views
6

NSEvent keyCode podaje kod skanowania klawiatury, który jest specyficznym sprzętowo kodem reprezentującym klucz fizyczny. Chcę przekonwertować kod skanowania na kod klucza wirtualnego, który jest logicznym kluczem opartym na układzie klawiatury użytkownika (QWERTY, AZERTY itp.).Map NSEvent keyCode na kod klucza wirtualnego

W systemie Windows mogę to zrobić poprzez MapVirtualKey. Co to jest odpowiednik OS X?

Odpowiedz

16

Kod klucza wirtualnego to dokładnie , a nie w zależności od układu klawiatury użytkownika. Wskazuje, który klawisz został naciśnięty, a nie jaką postać wygeneruje ten klucz, ani jak jest oznaczony.

Na przykład kVK_ANSI_A (od Carbon/HIToolbox/Events.h wartość 0x00) robi nie znaczy klucz, który generuje znak „a”, oznacza to klucz, który znajduje się w pozycji, że „A” klucz znajduje się w standardowej klawiaturze ANSI. Jeśli francuski układ klawiatury jest aktywny, ten klawisz wygeneruje "Q". Jeśli fizyczna klawiatura jest francuską klawiaturą, ten klucz będzie prawdopodobnie oznaczony jako "Q".

Kod wirtualny jest więc trochę podobny do kodu skanowania, ale z wyidealizowanej, standardowej klawiatury. Jest to, jak zauważono, niezależne od sprzętu. Jest również niezależny od układu klawiatury.

Aby przetłumaczyć kod wirtualny na znak, można użyć UCKeyTranslate(). Potrzebujesz danych "uchr" dla aktualnego układu klawiatury. Można to uzyskać, używając TISCopyCurrentKeyboardLayoutInputSource(), a następnie TISGetInputSourceProperty() z kTISPropertyUnicodeKeyLayoutData jako klucza właściwości.

Potrzebny jest również kod klawiatury. Wydaje mi się, że nadal można go używać, aby go uzyskać, nawet jeśli nie jest już udokumentowany, z wyjątkiem sekcji starszej wersji. Jeśli ci się nie podoba, że ​​można uzyskać CGEvent z NSEvent, stworzyć CGEventSource od tego, używając CGEventCreateSourceFromEvent(), a następnie użyj CGEventSourceGetKeyboardType() i nazywają CGEventGetIntegerValueField() z kCGKeyboardEventKeyboardType aby uzyskać typ klawiatury.

Oczywiście łatwiej jest po prostu użyć -[NSEvent characters] lub -[NSEvent charactersIgnoringModifiers]. Lub, jeśli implementujesz widok tekstowy, wyślij zdarzenia kluczowania do -[NSResponder interpretKeyEvents:] (omówione w Cocoa Event Handling Guide: Handling Key Events) lub -[NSTextInputContext handleEvent:] (jak omówiono w Cocoa Text Architecture Guide:Text Editing). Każdy z nich oddzwoni do widoku za pomocą odpowiedniego selektora akcji, takiego jak moveBackward: lub -insertText:, jeśli naciśnięcie klawisza (w kontekście ostatnich zdarzeń i źródła wejściowego) spowoduje wygenerowanie tekstu.

+0

Ah, dzięki za wyjaśnienie kodów kluczy wirtualnych z perspektywy Maca, wygląda na to, że różni się od systemu Windows. Wydaje się najłatwiejsze testowanie znakówIgnoringModifiers dla postaci, którymi moja aplikacja się interesuje. – NateS

1

Zgodnie z dokumentacją NSEvent, -[NSEvent keyCode] zwraca kod klucza wirtualnego niezależny od sprzętu.

+0

Hmm, masz rację, z jakiegoś powodu czytałem to jako zależne od sprzętu, tak myślę, ponieważ wydaje się, że to zachowanie w mojej aplikacji. Sądzę, że mam więcej badań. Nic tu nie widać, no dalej ... – NateS

Powiązane problemy