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

Мониторинг глобальных событий NSEvent в фоновом режиме

Я пишу простое приложение Mac, предназначенное для работы в фоновом режиме и выполнения определенных действий всякий раз, когда пользователь нажимает кнопку мыши. Приложение написано на Python с использованием PyObjC. Я использую addGlobalMonitorForEventsMatchingMask для просмотра событий NSLeftMouseDown:

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler)

Этот код отлично работает при работе в терминале. Однако, когда я связываю его как автономное приложение (используя py2app), а затем запускаю его, приложение сначала не получает никаких событий. (Или, по крайней мере, если это так, он не запускает код в моем методе обработчика.) Только когда я нажимаю на приложение в Dock, он начинает получать события, и после этого он продолжает получать события даже после него возвращается на задний план. Но он ничего не получает, пока не активируется один раз.

Мой вопрос: как я могу заставить свое приложение начать получать события сразу после его запуска, без необходимости сначала активировать его, щелкнув значок док-станции? Это какая-то известная причуда NSEvents, или может быть что-то не так с моим циклом запуска в PyObjC?

Любая помощь или руководство приветствуются!

Изменить: при дальнейшем тестировании кажется, что на самом деле мое приложение самопроизвольно начинает получать уведомления через десять секунд после запуска, независимо от того, активирую ли я его. Это немного раздражает, но прекрасно.

Однако, если я запустил приложение с LSUIElement = true или LSBackgroundOnly = true в моем Info.plist (что в конечном итоге я хочу сделать, так как это приложение должно работать только в фоновом режиме и никогда не появляться в Dock), я никогда не получать уведомления. Поэтому я все еще застрял.

4b9b3361

Ответ 1

Как вы сказали: "Только когда я нажимаю на приложение в Dock, он начинает принимать события", это означает, что обработчик регистрируется после нажатия на приложение в Dock.

Итак, это зависит от того, в какой момент кода вы вызываете это: NSEvent.addGlobalMonitorForEventsMatchingMask_handler_ (NSLeftMouseDownMask, обработчик), который регистрирует обработчик.

Вы должны зарегистрировать обработчик в функции appdidfinishlaunching.