В Mac OS X 10.6 и выше вы можете использовать методы + addGlobalMonitorForEventsMatchingMask: handler: и + addLocalMonitorForEventsMatchingMask: handler: , определенный из класса NSEvent
. Мониторинг событий сообщает следующую информацию:
Локальные и глобальные мониторы событий являются взаимоисключающими. Например, глобальный монитор не отслеживает поток событий приложения, в котором он установлен. Локальный монитор событий наблюдает только за потоком событий своего приложения. Чтобы отслеживать события из всех приложений, включая «текущее», необходимо установить оба монитора событий.
Код, показанный на этой странице, предназначен для локального монитора событий, но код для глобального монитора событий аналогичен; какие изменения вызывает метод 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;
}];
Когда монитор больше не нужен, удалите его, используя следующий код:
[NSEvent removeMonitor:_eventMonitor];