2013-08-23 22 views
6

NSEvent keyCode fornisce un codice di scansione della tastiera, che è un codice specifico per l'hardware che rappresenta la chiave fisica. Voglio convertire il codice di scansione in un codice di chiave virtuale, che è la chiave logica basata sul layout della tastiera degli utenti (QWERTY, AZERTY, ecc.).Mappa NSEvent keyCode al codice chiave virtuale

In Windows, è possibile farlo tramite MapVirtualKey. Qual è l'equivalente di OS X?

risposta

16

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.

+0

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

1

In base alla documentazione NSEvent, -[NSEvent keyCode] restituisce il codice di chiave virtuale indipendente dall'hardware.

+0

Hmm, hai ragione, per qualche ragione l'ho letto come dipendente dall'hardware, immagino perché questo sembra essere il comportamento nella mia app. Credo di avere più indagini da fare. Non c'è niente da vedere qui, continua ... – NateS

Problemi correlati