Sto lavorando a un'applicazione di dattilografia per Mac OSX che deve essere preceduta da sequenze di tasti, anche quando l'applicazione non è a fuoco.OS X: Rileva eventi keyDown a livello di sistema?
C'è un modo per fare in modo che il sistema trasmetta le sequenze di tasti all'app, possibilmente attraverso NSDistributedNotificationCenter? Googled me stesso stupido, e non sono stati in grado di trovare una risposta ...
EDIT:codice di esempio sotto.
Grazie a @NSGod per avermi indirizzato nella giusta direzione - ho finito per aggiungere uno global events monitor usando il metodo addGlobalMonitorForEventsMatchingMask: handler :, che funziona magnificamente. Per completezza, la mia applicazione si presenta così:
// register for keys throughout the device...
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
handler:^(NSEvent *event){
NSString *chars = [[event characters] lowercaseString];
unichar character = [chars characterAtIndex:0];
NSLog(@"keydown globally! Which key? This key: %c", character);
}];
Per me, la parte difficile stava usando blocchi, quindi mi danno un po 'di descrizione in caso aiuta chiunque:
La cosa da notare circa il sopra il codice è che è tutto un singolo metodo chiamata su NSEvent. Il blocco viene fornito come argomento, direttamente da a la funzione. Potresti pensare ad un metodo di delegazione in linea. Solo perché questo ha preso un po 'per affondare dentro per me, ho intenzione di lavorare attraverso passo per passo qui:
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask
Questo primo bit non è un problema. Stai chiamando un metodo di classe su NSEvent e dicendogli quale evento stai cercando di monitorare, in questo caso NSKeyDownMask. A list of masks for supported event types può essere trovato here.
Ora, veniamo alla parte difficile: gestore, che si aspetta un blocco:
handler:^(NSEvent *event){
Mi ci sono voluti un paio di errori di compilazione per ottenere questo diritto, ma (grazie Apple) sono stati errori molto costruttivo messaggi. La prima cosa da notare è il carato ^. Questo segnala l'inizio del blocco. Dopo di che, tra parentesi,
NSEvent *event
che dichiara la variabile che userete all'interno del blocco per catturare l'evento. Potresti chiamarlo
NSEvent *someCustomNameForAnEvent
non importa, starai usando quel nome all'interno del blocco. Quindi, questo è tutto quello che c'è da fare. Assicurati di chiudere la parentesi graffa e la staffa per terminare la chiamata al metodo:
}];
E il gioco è fatto! Questo è davvero un "one-liner". Non importa dove esegui questa chiamata all'interno della tua app - lo faccio nel metodo applicationDidFinishLaunching di AppDelegate. Quindi, all'interno del blocco, puoi chiamare altri metodi dall'app.
Hey @Pirripli grazie tanto per spiegare il blocco sintassi per me VERAMENTE aiuta per coloro che imparano! A proposito, ottimo :) – lab12
Nessun problema. ;) Sono sempre grato quando gli altri lo fanno per me, quindi cerco di dare una mano quando posso. –
Quando provo questo blocco di codice, ottengo l'errore: 'Tipi di puntatori del blocco incompatibili che inviano 'void (^) (struct NSEvent *)'' al parametro di tipo void (^) (NSEvent *) 'nella dichiarazione - @Pirripli , Ho dimenticato di aggiungere qualcosa? Hai dovuto includere qualcosa di speciale per supportare la sintassi del blocco? [Screenshot] (https://img.skitch.com/20111024-tnmnka59j9fqn6u145g2jppk5d.png) – Tronathan