Но, но, но ... Я не хочу быть NSResponder
подклассом.
@interface AMonitorNotAResponder : NSObject
@end
@implementation AMonitorNotAResponder
{
id eventMonitor; // An event monitor object; instance of
// private class _NSLocalEventObserver
}
- (id)init
{
self = [super init];
if( !self ) return nil;
NSEvent * (^monitorHandler)(NSEvent *);
monitorHandler = ^NSEvent * (NSEvent * theEvent){
switch ([theEvent keyCode]) {
case 123: // Left arrow
NSLog(@"Left behind.");
break;
case 124: // Right arrow
NSLog(@"Right as always!");
break;
case 125: // Down arrow
NSLog(@"Downward is Heavenward");
break;
case 126: // Up arrow
NSLog(@"Up, up, and away!");
break;
default:
break;
}
// Return the event, a new event, or, to stop
// the event from being dispatched, nil
return theEvent;
};
// Creates an object we do not own, but must keep track
// of so that it can be "removed" when we're done
eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask
handler:monitorHandler];
return self;
}
- (void)dealloc
{
[NSEvent removeMonitor:eventMon];
}
@end
Руководство по обработке событий дает некоторыевозможные варианты использованияКажется, что это дружественная версия CGEventTap
для Какао или способ обойти цепочку респондента для какой-то конкретной цели.Существует ограниченный выбор типов событий, которые можно отслеживать, например, только клавишей вниз, а не вверх. документы имеют список.
Также доступно: проверка событий, поступающих в любое другое приложение (без возможности их изменения), используя addGlobalMonitorForEventsMatchingMask:handler:
.Как и события, этот метод требует, чтобы Accessibility был включен.