Подтвердить что ты не робот

Как можно обнаружить переключатель управления Mission или Command-Tab, заменив одну программу в OS X?

Я пытаюсь использовать CGAssociateMouseAndMouseCursorPosition (NO) в программе. Это отключает мышь от курсора на экране, когда ваше приложение находится "на переднем плане". К сожалению, он также отключает его при управлении миссией или переключателем приложений или кто знает, что еще может придумать.

До сих пор я знаю:

  • Приложение по-прежнему активно.
  • Окно по-прежнему остается ключевым.
  • Ничего не отправляется в центр уведомлений по умолчанию, когда все это происходит.
  • Приложение перестает принимать события с перемещением мыши, но NSEvent addGlobalMonitorForEventsMatchingMask: обработчик: также не получает их, что, как ни странно, не так. Он должен получать любые события, не доставленные в мое приложение. (Я планировал обнаружить отсутствующие события, чтобы узнать, когда снова связать мышь.

Итак, есть ли способ обнаружить, когда мое приложение больше не контролируется, в частности, потому что управление миссией или коммутатор занял верх? Они действительно ожидают, что мышь будет работать, и мне нужно восстановить эту связь для них.

4b9b3361

Ответ 1

Я разделяю ваше удивление, что глобальный монитор событий не видит события. В аналогичной ситуации я использовал Quartz Event Tap для аналогичной цели. Глобальный монитор событий Cocoa очень похож на события, поэтому я решил, что это сработает.

Я нажал кнопку kCGAnnotatedSessionEventTap и сравнил результат с CGEventGetIntegerValueField(event, kCGEventTargetUnixProcessID) до getpid(), чтобы определить, когда события переходили в другое приложение (например, Mission Control или Exposé). (Я отключу вкладку, когда мое приложение уходит в отставку с активным статусом, поэтому оно должно получать только события, предназначенные для другого приложения, когда этот вид пользовательского интерфейса наложения представлен.)

Кстати, вы упомянули о мониторинге центра уведомлений по умолчанию, но, если есть уведомление о контроле миссии или тому подобное, он скорее всего попадет в центр распределенных уведомлений (NSDistributedNotificationCenter). Итак, стоит проверить это.

Ответ 2

Вы пробовали просить NSRunningApplication?