2011-11-20 9 views
6

Ho bisogno di creare una casella di input globale per hot key nella mia app Cocoa.Come implementare l'immissione del tasto di scelta rapida in Mac Cocoa App?

Conosco Shortcut Recorder, ma è una soluzione molto vecchia. Ha parti implementate usando Carbon, che è stato deprecato, e non posso pubblicare la mia app sul Mac App Store se la utilizzo.

Esiste una soluzione moderna pronta per l'uso? Qualcuno può darmi il modo di farlo da solo (non so da dove cominciare)?

+1

Non tutto il carbonio è deprecato, solo le parti della GUI. –

risposta

14

C'è una struttura moderna denominata MASShortcut per l'implementazione di scorciatoie globali in OS X 10.7+.

+4

(che ha creato) <- non che ci sia qualcosa di sbagliato con questo, ma dovrebbe essere trasparente – cwRichardKim

+0

Funziona solo per le scorciatoie che non esistono già in altre app? Ho problemi con la registrazione delle scorciatoie, una delle quali l'ho vista implementata in un'altra app. Inoltre se cambio il collegamento predefinito non funziona e la chiave che non è la chiave di modifica non funziona in nessuna app mentre la mia è in esecuzione. Voglio prendere cmd + c e alt + cmd + v –

13

In Mac OS X 10.6 e versioni successive, è possibile utilizzare i metodi +addGlobalMonitorForEventsMatchingMask:handler: e +addLocalMonitorForEventsMatchingMask:handler: definiti dalla classe NSEvent. Monitoring Events riporta le seguenti informazioni:

I monitor degli eventi locali e globali si escludono a vicenda. Ad esempio, il monitor globale non osserva il flusso di eventi dell'applicazione in cui è installato. Il monitor degli eventi locale osserva solo il flusso di eventi della sua applicazione. Per monitorare gli eventi da tutte le applicazioni, inclusa l'applicazione "corrente", è necessario installare entrambi i monitor degli eventi.

Il codice visualizzato in questa pagina è per un monitor di eventi locale, ma il codice per un monitor eventi globale è simile; ciò che cambia è il metodo invocato NSEvent.

_eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask: 
     (NSLeftMouseDownMask | NSRightMouseDownMask | NSOtherMouseDownMask | NSKeyDownMask) 
     handler:^(NSEvent *incomingEvent) { 
    NSEvent *result = incomingEvent; 
    NSWindow *targetWindowForEvent = [incomingEvent window]; 
    if (targetWindowForEvent != _window) { 
     [self _closeAndSendAction:NO]; 
    } else if ([incomingEvent type] == NSKeyDown) { 
     if ([incomingEvent keyCode] == 53) { 
      // Escape 
      [self _closeAndSendAction:NO]; 
      result = nil; // Don't process the event 
     } else if ([incomingEvent keyCode] == 36) { 
      // Enter 
      [self _closeAndSendAction:YES]; 
      result = nil; 
     } 
    } 
    return result; 
}]; 

Una volta che il monitor non è più necessario, si rimuove utilizzando il seguente codice:

[NSEvent removeMonitor:_eventMonitor]; 
+0

Mentre funziona, è difficile. L'API di Carbon Event Manager per questo è ancora supportata ed è più semplice e più semplice, e i due wrapper Cocoa di terze parti rendono ancora più semplice. –

+4

Questo non funziona per gli eventi chiave a meno che l'app sia attendibile per l'accessibilità. Il monitor globale –

+0

non funziona, anche se a livello locale è necessario ascoltare la chiave. Ma suppongo che le persone cerchino un tasto di scelta globale :). – Rabiees

10

Non tutti Carbon è deprecato. Non è più possibile creare un'applicazione a base di carbonio puro, ma alcune API sopravvivono e alcune di esse sono ancora il modo più semplice per eseguire determinate operazioni.

Uno di questi è l'API hotkey di Carbon Events. È certamente possibile setacciare tutti gli eventi utilizzando i metodi di monitoraggio eventi di NSEvent, ma è un lavoro non necessario. L'API hotkey di Carbon Events è ancora supportata e molto più semplice: basta dire quale chiave si desidera abbinare e quale funzione chiamare quando si preme il tasto. E ci sono wrapper Cocoa come DDHotKey che lo rendono ancora più semplice.

+0

Grazie, Peter! Ma so come registrare i tasti di scelta rapida. È semplice per me Voglio registrare le chiavi dall'utente, quindi ho bisogno di implementare qualcosa come "hot key NSTextField" nella mia finestra delle preferenze. –

+0

@VictorShcherbakov: ShortcutRecorder è ancora il modo migliore per fare ciò che conosco. Dovrebbe essere compatibile a 64 bit, almeno nella versione trunk. http://code.google.com/p/shortcutrecorder/ –

+0

shortcutrecorder (l'applicazione demo) non ha funzionato per me su lion + xcode4. quindi sarei comunque felice di conoscere altre opzioni di campo di input diverse da shortcutrecorder – cyphunk

Problemi correlati