Для этого и нужно уведомление kAXMenuItemSelectedNotification
. Простой способ поиграть с этим материалом - использовать UI Browser :
- Выберите приложение во всплывающем меню «Цель».
- Выберите «Уведомления» из всплывающего меню «Ящик».
- Нажмите «пункт меню выбран» и «Зарегистрироваться» (или просто дважды щелкните в таблице).
- Выберите «Журнал уведомлений» в меню «Вид».
- Переключитесь на выбранное вами приложение и выберите пункт меню.
Это позволяет видеть, когда запускаются уведомления. Ваш код может выглядеть примерно так:
AXError err;
AXObserverRef observer;
pid_t currentAppPID = [NSRunningApplication currentApplication].processIdentifier;
if ( (err = AXObserverCreate(currentAppPID, notificationCallback, &observer) != kAXErrorSuccess); // XXX failed
CFRunLoopAddSource(CFRunLoopGetCurrent(), AXObserverGetRunLoopSource(observer), kCFRunLoopDefaultMode);
AXUIElementRef element = AXUIElementCreateApplication(currentAppPID);
if (element == NULL); // XXX failed
if ( (err = AXObserverAddNotification(observer, element, kAXMenuItemSelectedNotification, NULL)) != kAXErrorSuccess); // XXX failed
Обратите внимание, что вам придется наблюдать за каждым запущенным приложением индивидуально (и дополнительными приложениями, когда они запускаются / выходят), или регистрироваться для NSWorkspaceDidActivateApplicationNotification
и отменять регистрацию / регистрацию в самом переднем приложении в этой точке (последнее, вероятно, проще всего при 10.6, потому что вы получаете NSRunningApplication
как часть уведомления).
Я думаю, что на самом деле выбор элемента будет проще для пользователя, но если вы действительно хотите нажать другую клавишу, чтобы завершить действие, вы можете наблюдать kAXSelectedChildrenChanged
, который будет срабатывать, когда выбор перемещается из одного меню. пункт другому.