2013-07-24 26 views
23

我正在編寫一個簡單的Mac應用程序,用於在後臺運行,並在用戶單擊鼠標按鈕時執行某些操作。該應用程序使用PyObjC以Python編寫。我使用addGlobalMonitorForEventsMatchingMask以觀察NSLeftMouseDown事件:在終端上運行時NSEvent後臺全局事件監視

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler) 

此代碼的工作非常完美。但是,當我將它作爲獨立應用程序(使用py2app)捆綁並啓動它時,應用程序一開始就不會收到任何事件。 (或者至少,如果是這樣的話,它不會在我的處理程序方法中運行代碼。)只有當我點擊Dock中的應用程序時,它纔會開始接收事件,然後在它之後繼續接收事件返回到背景。但是直到激活一次纔會收到任何內容。

我的問題是:如何讓我的應用程序在啓動時立即開始接收事件,而無需先單擊Dock圖標激活它?這是一些已知的NSEvents的怪癖,或者可能是我的PyObjC中的運行循環有問題?

任何幫助或指導,非常感謝!

編輯:經過進一步測試,事實上,似乎我的應用程序在啓動後10秒內自發地開始接收通知,無論是否激活它。這有點煩人,但很好。

但是,如果我跑在我的Info.plist(我最終想這樣做,因爲這個應用程序應該在後臺只運行並不會出現在Dock中),我從來沒有收到任何通知或LSUIElement = trueLSBackgroundOnly = true應用。所以我仍然堅持。

+1

您確定,該行在應用程序啓動時執行嗎? – akaRem

+5

你可以發佈一個[最小的,完整的,有效的例子](http://stackoverflow.com/help/mcve),其他人可以用它來重現和調試問題嗎? – abarnert

+0

檢查它是否符合AppStore的指導原則。但如果是個人使用,請使用Xcode進行試用。想要一個例子嗎? – 2014-01-20 17:44:26

回答

1

正如你所說的「只有當我點擊Dock中的應用程序纔會開始接收事件」,這意味着在點擊Dock中的應用程序後,處理程序會被註冊。

所以,在你調用這個這一點在代碼依賴於:NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask,處理程序), 所註冊的處理程序。

您應該在appdidfinishlaunching函數中註冊處理函數。