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.
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