我正在编写一个简单的Mac应用程序,旨在在后台运行并在用户单击鼠标按钮时执行某些操作。该应用程序是使用PyObjC用Python编写的。我正在使用addGlobalMonitorForEventsMatchingMask
来观看NSLeftMouseDown
个事件:
NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler)
此代码在终端中运行时效果很好。但是,当我将其捆绑为独立应用程序(使用py2app)然后启动它时,应用程序最初不会收到任何事件。 (或者至少,如果确实如此,它不会在我的处理程序方法中运行代码。)只有当我点击Dock中的应用程序时它才开始接收事件,然后,它继续接收事件,甚至在它之后返回后台。但是在激活一次之前它没有收到任何东西。
我的问题是:如何让我的应用程序在启动后立即开始接收事件,而无需先通过单击Dock图标来激活它?这是NSEvents
的一些已知的怪癖,还是PyObjC中的运行循环可能有问题?
非常感谢任何帮助或指导!
编辑:经过进一步测试,事实上,我的应用程序似乎在发布后大约十秒钟内自动开始接收通知,无论我是否激活它。这有点烦人,但很好。
但是,如果我在我的LSUIElement = true
中使用LSBackgroundOnly = true
或Info.plist
运行应用程序(我最终想要这样做,因为此应用程序应该只在后台运行而且从不出现在Dock中,我从未收到过通知。所以我仍然被困住了。
答案 0 :(得分:1)
正如您所说“只有当我点击Dock中的应用程序才会开始接收事件”时,这意味着在您点击Dock中的应用程序后,处理程序会被注册。
所以它取决于你在调用它的代码中的哪一点:NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask,handler), 那是注册处理程序。
您应该在appdidfinishlaunching函数中注册处理程序。