Как можно обнаружить переключатель управления Mission или Command-Tab, заменив одну программу в OS X?
Я пытаюсь использовать CGAssociateMouseAndMouseCursorPosition (NO) в программе. Это отключает мышь от курсора на экране, когда ваше приложение находится "на переднем плане". К сожалению, он также отключает его при управлении миссией или переключателем приложений или кто знает, что еще может придумать.
До сих пор я знаю:
- Приложение по-прежнему активно.
- Окно по-прежнему остается ключевым.
- Ничего не отправляется в центр уведомлений по умолчанию, когда все это происходит.
- Приложение перестает принимать события с перемещением мыши, но NSEvent addGlobalMonitorForEventsMatchingMask: обработчик: также не получает их, что, как ни странно, не так. Он должен получать любые события, не доставленные в мое приложение. (Я планировал обнаружить отсутствующие события, чтобы узнать, когда снова связать мышь.
Итак, есть ли способ обнаружить, когда мое приложение больше не контролируется, в частности, потому что управление миссией или коммутатор занял верх? Они действительно ожидают, что мышь будет работать, и мне нужно восстановить эту связь для них.
Ответы
Ответ 1
Я разделяю ваше удивление, что глобальный монитор событий не видит события. В аналогичной ситуации я использовал Quartz Event Tap для аналогичной цели. Глобальный монитор событий Cocoa очень похож на события, поэтому я решил, что это сработает.
Я нажал кнопку kCGAnnotatedSessionEventTap
и сравнил результат с CGEventGetIntegerValueField(event, kCGEventTargetUnixProcessID)
до getpid()
, чтобы определить, когда события переходили в другое приложение (например, Mission Control или Exposé). (Я отключу вкладку, когда мое приложение уходит в отставку с активным статусом, поэтому оно должно получать только события, предназначенные для другого приложения, когда этот вид пользовательского интерфейса наложения представлен.)
Кстати, вы упомянули о мониторинге центра уведомлений по умолчанию, но, если есть уведомление о контроле миссии или тому подобное, он скорее всего попадет в центр распределенных уведомлений (NSDistributedNotificationCenter
). Итак, стоит проверить это.
Ответ 2
Вы пробовали просить NSRunningApplication?