2013-07-24 11 views
23

Ich schreibe eine einfache Mac-Anwendung, die im Hintergrund ausgeführt wird und bestimmte Aktionen ausführt, wenn der Benutzer die Maustaste drückt. Die App ist in Python mit PyObjC geschrieben. Ich verwende addGlobalMonitorForEventsMatchingMask für NSLeftMouseDown Veranstaltungen zu sehen:NSEvent globale Ereignisüberwachung im Hintergrund

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler) 

Dieser Code funktioniert perfekt, wenn im Terminal läuft. Wenn ich es jedoch als eigenständige App (mit py2app) bündle und es dann starte, erhält die App zunächst keine Ereignisse. (Oder zumindest, wenn dies der Fall ist, wird der Code in meiner Handler-Methode nicht ausgeführt.) Erst wenn ich auf die App im Dock klicke, werden Ereignisse empfangen, und danach werden weiterhin Ereignisse empfangen kehrt in den Hintergrund zurück. Aber es erhält nichts bis einmal aktiviert.

Meine Frage ist: Wie kann ich mit meiner App beginnen, Ereignisse zu empfangen, sobald sie gestartet wird, ohne zuerst durch Klicken auf das Dock-Symbol aktiviert zu werden? Ist das eine bekannte Eigenart von NSEvents, oder stimmt da etwas mit meiner Laufschleife in PyObjC nicht?

Jede Hilfe oder Anleitung wird sehr geschätzt!

Edit: Nach weiteren Tests scheint es, dass meine App spontan zehn Sekunden nach dem Start Benachrichtigungen erhält, unabhängig davon, ob ich sie aktiviere. Was etwas nervig ist, aber gut.

Allerdings, wenn ich laufe die App entweder mit LSUIElement = true oder LSBackgroundOnly = true in meinen Info.plist (was ich schließlich tun will, da diese App nur im Hintergrund ausgeführt werden soll und nie im Dock angezeigt), habe ich nie Benachrichtigungen erhalten. Also bin ich immer noch fest.

+1

Sind Sie sicher, dass diese Zeile beim Start der App ausgeführt wird? – akaRem

+5

Können Sie ein [minimales, vollständiges, gültiges Beispiel] (http://stackoverflow.com/help/mcve) posten, das andere verwenden können, um das Problem zu reproduzieren und möglicherweise zu debuggen? – abarnert

+0

Überprüfen Sie, ob es den Richtlinien des AppStore entspricht. aber wenn es für den persönlichen Gebrauch ist, versuchen Sie es mit Xcode. Willst du ein Beispiel? –

Antwort

1

Wie Sie gesagt haben "Nur wenn ich auf die App im Dock klicke, fängt es an, Ereignisse zu empfangen", dh der Handler wird registriert, nachdem Sie auf die App im Dock geklickt haben.

So kommt es, an welcher Stelle im Code auf folgende fordern: NSEvent.addGlobalMonitorForEventsMatchingMask_handler_ (NSLeftMouseDownMask, handler), , die die Handler registriert.

Sie sollten den Handler in appdidfinishlaunching Funktion registrieren.