NSEvent全局事件监控在后台进行

ekl*_*ekl 23 python macos cocoa pyobjc appkit

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

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

但是,如果我使用其中任何一个LSUIElement = trueLSBackgroundOnly = true我的Info.plist(我最终想要做的,因为这个应用程序应该只在后台运行并且永远不会出现在Dock中)运行应用程序,我从未收到通知.所以我仍然被困住了.

小智 1

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

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

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