python macos cocoa appkit pyobjc

python - Monitoreo global de eventos NSEvent en segundo plano



macos cocoa (1)

Estoy escribiendo una aplicación Mac simple diseñada para ejecutarse en segundo plano y realizar ciertas acciones cada vez que el usuario hace clic en el botón del mouse. La aplicación está escrita en Python usando PyObjC. Estoy usando addGlobalMonitorForEventsMatchingMask para ver los eventos de NSLeftMouseDown :

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler)

Este código funciona perfectamente cuando se ejecuta en el terminal. Sin embargo, cuando lo combino como una aplicación independiente (usando py2app) y luego lo lanzo, la aplicación no recibe ningún evento al principio. (O al menos, si lo hace, no ejecuta el código en el método de mi controlador). Solo cuando hago clic en la aplicación en el Dock, comienza a recibir eventos y, después de eso, continúa recibiendo eventos incluso después. Vuelve al fondo. Pero no recibe nada hasta que se activa una vez.

Mi pregunta es: ¿Cómo puedo hacer que mi aplicación comience a recibir eventos tan pronto como se inicie, sin tener que ser activada primero haciendo clic en el icono del Dock? ¿Es esto un capricho conocido de NSEvents , o tal vez hay algo mal con mi ciclo de ejecución en PyObjC?

Cualquier ayuda u orientación es muy apreciada!

Edición: Tras realizar más pruebas, parece que, de hecho, mi aplicación comienza a recibir notificaciones espontáneamente unos diez segundos después del lanzamiento, independientemente de si lo activo o no. Lo cual es un poco molesto, pero está bien.

Sin embargo, si ejecuto la aplicación con LSUIElement = true o LSBackgroundOnly = true en mi Info.plist (que en última instancia quiero hacer, ya que esta aplicación solo debería ejecutarse en segundo plano y nunca aparecer en el Dock), nunca recibo notificaciones. . Así que todavía estoy atascado.


Como dijo "Solo cuando hago clic en la aplicación en el Dock, comienza a recibir eventos", eso significa que el controlador se registra después de hacer clic en la aplicación en el Dock.

Entonces, depende de a qué punto en el código que está llamando: NSEvent.addGlobalMonitorForEventsMatchingMask_handler_ (NSLeftMouseDownMask, handler), que está registrando el controlador.

Debe registrar el controlador en la función appdidfinishlaunching.