2013-07-24 16 views
23

Piszę prostą aplikację na Mac, zaprojektowaną do działania w tle i wykonywania określonych czynności za każdym razem, gdy użytkownik kliknie przycisk myszy. Aplikacja jest napisana w Pythonie przy użyciu PyObjC. Używam addGlobalMonitorForEventsMatchingMask oglądać na NSLeftMouseDown zdarzeń:Monitorowanie zdarzeń globalnych NSEvent w tle

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler) 

Ten kod działa doskonale podczas pracy w terminalu. Jednak gdy pakuję go jako samodzielną aplikację (za pomocą py2app), a następnie uruchamiam ją, aplikacja nie otrzymuje żadnych zdarzeń na początku. (A przynajmniej, jeśli tak, to nie uruchamia kodu w mojej metodzie obsługi). Tylko wtedy, gdy kliknę aplikację w Docku, zacznie odbierać zdarzenia, a po tym nadal będzie odbierać zdarzenia nawet po jego zakończeniu. powraca do tła. Ale nic nie otrzyma, dopóki nie zostanie aktywowana raz.

Moje pytanie brzmi: Jak mogę dostać moje app, aby rozpocząć odbieranie zdarzeń tak szybko jak to jest uruchomiony, bez konieczności najpierw zostać aktywowane poprzez kliknięcie ikony Dock? Czy jest to znane dziwactwo z NSEvents, czy może coś jest nie tak z moją pętlą uruchamiania w PyObjC?

Każda pomoc lub wskazówki są mile widziane!

Edit: Na dalszych badań, wydaje się, że w rzeczywistości, moja aplikacja samoistnie rozpoczyna odbieranie powiadomień o dziesięć sekund po uruchomieniu, niezależnie od tego, czy ja go uaktywnić. Co jest nieco denerwujące, ale w porządku.

Jeśli jednak uruchomić aplikację z obu LSUIElement = true lub LSBackgroundOnly = true w moim Info.plist (co ostatecznie chcą robić, ponieważ ta aplikacja powinna działać tylko w tle i nie pojawiają się w stacji dokującej), nigdy nie otrzymują powiadomień. Więc nadal tkwię.

+1

Czy jesteś pewien, że ta linia jest uruchamiana po uruchomieniu aplikacji? – akaRem

+5

Czy możesz opublikować [minimalny, kompletny, prawidłowy przykład] (http://stackoverflow.com/help/mcve), z którego inni mogą korzystać, aby odtworzyć i być może usunąć problem? – abarnert

+0

Sprawdź, czy spełnia on wymagania AppStore'a. ale jeśli jest to do użytku osobistego, spróbuj z Xcode. chcesz przykład? –

Odpowiedz

1

Jak powiedział: „Tylko wtedy, gdy klikam na aplikacji w Docku to rozpocząć odbieranie zdarzeń”, co oznacza, że ​​program obsługi zostanie zarejestrowane po kliknięciu w aplikacji w Docku.

Więc to zależy od tego, w którym momencie w kodzie dzwonisz to: NSEvent.addGlobalMonitorForEventsMatchingMask_handler_ (NSLeftMouseDownMask, obsługę), że rejestruje obsługi.

Należy zarejestrować program obsługi w funkcji appdidfinishlaunching.