Il codice tasto virtuale è precisamente non in base al layout della tastiera dell'utente. Indica quale tasto è stato premuto, non quale carattere quello tasto produrrebbe né come è etichettato.
Ad esempio, kVK_ANSI_A
(da Carbon/HIToolbox/Events.h, valore 0x00
) fa non significa la chiave che produce il carattere 'A', significa che la chiave si trova nella posizione che la 'A' la chiave è in una tastiera standard ANSI. Se un layout di tastiera francese è attivo, quel tasto produrrà "Q". Se la tastiera fisica è una tastiera francese, quella chiave sarà probabilmente etichettata come 'Q'.
Quindi, il codice tasto virtuale è un po 'come un codice di scansione, ma da una tastiera standard idealizzata. È, come noto, indipendente dall'hardware. È anche indipendente dal layout della tastiera.
Per tradurre dal codice tasto virtuale a un carattere, è possibile utilizzare UCKeyTranslate()
. Sono necessari i dati 'uchr' per il layout corrente della tastiera. È possibile ottenere che utilizzando TISCopyCurrentKeyboardLayoutInputSource()
e quindi TISGetInputSourceProperty()
con kTISPropertyUnicodeKeyLayoutData
come chiave di proprietà.
È inoltre necessario il codice del tipo di tastiera. Credo che sia ancora supportato l'uso di LMGetKbdType()
per ottenerlo, anche se non è più documentato tranne nella sezione legacy. Se non ti piace questo, è possibile ottenere un CGEvent
dal NSEvent
,
creare un
CGEventSource
da che l'utilizzo
CGEventCreateSourceFromEvent()
, e quindi utilizzare
CGEventSourceGetKeyboardType()
e chiamare CGEventGetIntegerValueField()
con kCGKeyboardEventKeyboardType
per ottenere il tipo di tastiera.
Naturalmente, è molto più semplice utilizzare semplicemente -[NSEvent characters]
o -[NSEvent charactersIgnoringModifiers]
. In alternativa, se si sta implementando una visualizzazione di testo, inviare gli eventi key-down a -[NSResponder interpretKeyEvents:]
(come descritto in Cocoa Event Handling Guide: Handling Key Events) o -[NSTextInputContext handleEvent:]
(come illustrato in Cocoa Text Architecture Guide:Text Editing). Ciascuno di questi richiama la vista con il selettore di azioni appropriato, come moveBackward:
, o con -insertText:
se il tasto (nel contesto di eventi recenti e la sorgente di input) produce testo.
fonte
2013-08-23 23:50:12
Ah, grazie per aver spiegato i codici chiave virtuali dal punto di vista del Mac, sembra essere diverso da Windows. Sembra più facile testare i personaggi con i modificatori per i personaggi a cui la mia app si interessa. – NateS