Я обычно иду с IFoo для интерфейса и AbstractFoo для скелетной реализации, которая является соединением конвенций Java и.NET.
Один из вариантов - использовать EventTaps. Это позволяет отслеживать все события клавиатуры. Видеть: http://developer.apple.com/mac/library/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventTapCreate
К сожалению, краны событий перестанут работать, если приложение запрашивает безопасный ввод. Например Quicken.
OSStatus err = InstallApplicationEventHandler(&globalHotkeyHandler, GetEventTypeCount(eventTypes), eventTypes, NULL, NULL);
Это не глобально. Это устанавливает обработчик только тогда, когда ваше собственное приложение активно, и (я полагаю) после собственных фильтров событий Carbon Event Manager.
Вам необходимо использовать InstallEventHandler
, который принимает цель события в качестве первого параметра ( InstallApplicationEventHandler
- это макрос, который передает цель события приложения).
Для событий, которые происходят, когда ваше приложение неактивно, желаемой целью является GetEventMonitorTarget ()
. Для событий, которые происходят, когда ваше приложение активно , вам нужна цель GetEventDispatcherTarget ()
. Чтобы улавливать события независимо от того, какое приложение активно, установите обработчик на обе цели.
Однако в настоящее время я бы просто использовал CGEventTaps, как предложил Лейбовицн.