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];
Non tutto il carbonio è deprecato, solo le parti della GUI. –