2013-07-24 8 views
23

Sto scrivendo una semplice applicazione Mac progettata per essere eseguita in background ed eseguire determinate azioni ogni volta che l'utente fa clic sul pulsante del mouse. L'app è scritta in Python usando PyObjC. Sto usando addGlobalMonitorForEventsMatchingMask guardare per NSLeftMouseDown eventi:Monitoraggio degli eventi globali NSEvent in background

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler) 

Questo codice funziona perfettamente quando si esegue nel terminale. Tuttavia, quando lo aggrego come app standalone (usando py2app) e poi lo avvio, l'app non riceve alcun evento all'inizio. (O almeno, se lo fa, non esegue il codice nel mio metodo handler.) Solo quando faccio clic sull'app nel Dock inizia a ricevere eventi e, successivamente, continua a ricevere eventi anche dopo di esso ritorna in background. Ma non riceve nulla finché non viene attivato una volta.

La mia domanda è: come posso fare in modo che la mia app inizi a ricevere eventi non appena viene avviata, senza dover essere attivata prima facendo clic sull'icona del Dock? Si tratta di una stranezza nota di NSEvents o forse c'è qualcosa di sbagliato nel mio ciclo di esecuzione in PyObjC?

Qualsiasi aiuto o guida è molto apprezzato!

Modifica: dopo ulteriori test, sembra che, in effetti, la mia app inizi a ricevere notifiche spontanee circa dieci secondi dopo il lancio, indipendentemente dal fatto che l'abbia attivata. Che è leggermente fastidioso, ma va bene.

Tuttavia, se corro l'applicazione sia con LSUIElement = true o LSBackgroundOnly = true nei miei notifiche Info.plist (che in ultima analisi, voglio fare, dal momento che questa applicazione deve essere eseguito solo in background e non appaiono mai nel Dock), non ho mai ricevere. Quindi sono ancora bloccato.

+1

Sei sicuro che questa riga venga eseguita all'avvio dell'app? – akaRem

+5

Puoi pubblicare un [esempio minimo, completo, valido] (http://stackoverflow.com/help/mcve) che altri possono utilizzare per riprodurre e forse eseguire il debug del problema? – abarnert

+0

controlla se soddisfa le linee guida di AppStore. ma se è per uso personale, provalo con Xcode. vuoi un esempio? –

risposta

1

Come hai detto "Solo quando faccio clic sull'app nel Dock inizia a ricevere eventi", ovvero il gestore viene registrato dopo aver fatto clic sull'app nel Dock.

Quindi dipende in quale punto il codice che si sta chiamando questo: NSEvent.addGlobalMonitorForEventsMatchingMask_handler_ (NSLeftMouseDownMask, handler), che sta registrando il gestore.

È necessario registrare il gestore nella funzione appdidfinishlaunching.