背景下的NSEvent全局事件监测

23

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

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler)

当我在终端中运行此代码时,它可以完美地工作。然而,当我将其打包为独立应用程序(使用py2app)并启动它时,应用程序最初不会接收任何事件。(或者至少,如果确实有,它也不会运行我的处理程序方法中的代码)。只有当我在Dock中点击该应用程序时,它才开始接收事件,并且在返回后,它仍然会继续接收事件。但是,在未被激活之前,它不会接收任何内容。

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

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

编辑:经进一步测试,实际上,在启动大约十秒钟后,我的应用程序会自动开始接收通知,无论是否激活它。这有点让人烦恼,但没关系。

但是,如果我在我的 Info.plist 中使用 LSUIElement = trueLSBackgroundOnly = true 运行应用程序(我最终想要这样做,因为此应用程序应仅在后台运行且永远不会出现在Dock中),我将永远不会收到通知。所以我还是陷入了困境。


1
你确定这行代码在应用程序启动时执行吗? - akaRem
5
您能否发布一个最小化,完整且有效的示例,以便他人可以使用并重现问题,可能还可以进行调试? - abarnert
检查是否符合AppStore的指南。但如果是个人使用,请尝试使用Xcode。需要一个例子吗? - user1411443
请注意,您的处理程序不会被调用以处理发送到您自己应用程序的事件。- 仅仅是为了检查,这难道不是您的情况吗?也就是说,在您的应用程序处于活动状态时,您想要检查鼠标事件? - Nickolay Olshevsky
你的OSX版本是什么? - bosnjak
你在哪里调用NSEvent.addGlobalMonitorForEventsMatchingMask_handler函数? - AnthonyLambert
1个回答

1
正如你所说:“只有当我在Dock中点击应用程序时,它才开始接收事件”,这意味着在你点击Dock中的应用程序后才注册处理程序。
因此,这取决于你在代码中调用NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler)的那个点,也就是注册处理程序的地方。
你应该在appdidfinishlaunching函数中注册处理程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接