Я думаю, что ваш лучший вариант * будет +[NSEvent addLocalMonitorForEventsMatchingMask:handler:]
.Это создает объект, который будет вызывать обработчик блока всякий раз, когда ваше приложение получает событие указанного типа.Обработка происходит непосредственно перед тем, как ваш NSApplication
отправляет событие в окно, и у вас есть возможность изменить событие или остановить его дальнейшее продолжение.
Таким образом, вы можете перехватывать события нажатия клавиш по мере их передачив свое приложение и делайте с ними все, что захотите, прежде чем какой-либо элемент управления сможет их увидеть.Первоначально я опубликовал это в еще один вопрос , но вот фрагмент кода для действий с нажатиями клавиш со стрелками:
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; therefore, put it in an ivar.
eventMon = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask
handler:monitorHandler];
См. Руководство по обработке событий для некоторых деталейо том, что вы должны делать с этим объектом монитора.В частности, Apple, по-видимому, "не рекомендует" удалять его из dealloc
, но не дает оснований.
* Пока вы можете потребовать Snow Leopard, по крайней мере.