23

我正在编写一个简单的 Mac 应用程序,旨在在用户单击鼠标按钮时在后台运行并执行某些操作。该应用程序是使用 PyObjC 用 Python 编写的。我addGlobalMonitorForEventsMatchingMask用来监视NSLeftMouseDown事件:

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler)

此代码在终端中运行时完美运行。但是,当我将它捆绑为独立应用程序(使用 py2app)然后启动它时,该应用程序一开始不会收到任何事件。(或者至少,如果确实如此,它不会运行我的处理程序方法中的代码。)只有当我在 Dock 中单击应用程序时,它才会开始接收事件,之后,即使在它之后它也会继续接收事件返回后台。但在激活一次之前它不会收到任何东西。

我的问题是:如何让我的应用程序在启动后立即开始接收事件,而不必先通过单击 Dock 图标激活?这是一些已知的怪癖NSEvents,还是我在 PyObjC 中的运行循环可能有问题?

非常感谢任何帮助或指导!

编辑:经过进一步测试,事实上,无论我是否激活它,我的应用程序似乎都会在启动后大约十秒内自发地开始接收通知。这有点烦人,但很好。

但是,如果我使用其中一个LSUIElement = true或其中一个运行应用程序(LSBackgroundOnly = trueInfo.plist最终想要这样做,因为这个应用程序应该只在后台运行并且永远不会出现在 Dock 中),我永远不会收到通知。所以我仍然卡住了。

4

1 回答 1

1

正如您所说的“只有当我单击 Dock 中的应用程序时,它才会开始接收事件”,这意味着处理程序在您单击 Dock 中的应用程序后注册。

因此,这取决于您在代码中的哪个位置调用它: NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler) ,即注册处理程序。

您应该在 appdidfinishlaunching 函数中注册处理程序。

于 2014-04-09T10:25:00.623 回答