后台NSEvent全局事件监视

2024-09-30 14:26:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSLeftMouseDownMask, handler)

这段代码在终端中运行时工作得很好。但是,当我把它捆绑成一个独立的应用程序(使用py2app)然后启动它时,这个应用程序一开始不会接收任何事件。(或者至少,如果有,它不会在我的处理程序方法中运行代码。)只有当我在Dock中单击应用程序时,它才会开始接收事件,然后,即使返回后台,它也会继续接收事件。但只有激活一次它才会收到任何信息。在

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

如有任何帮助或指导,我们将不胜感激!在

编辑:经过进一步的测试,事实上,我的应用程序在启动10秒后自动开始接收通知,而不管我是否激活它。这有点烦人,但是很好。在

但是,如果我用LSUIElement = trueLSBackgroundOnly = true在我的Info.plist中运行应用程序(这是我最终想要做的,因为这个应用程序应该只在后台运行,而不会出现在Dock中),我永远不会收到通知。所以我还是被卡住了。在


Tags: 代码用户true应用程序mac事件pyobjc鼠标
1条回答
网友
1楼 · 发布于 2024-09-30 14:26:15

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

所以这取决于你在代码中的哪一点调用它:ForEadEvent事件处理程序_(NSLeftMouseDownMask,处理程序), 正在注册处理程序。在

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

相关问题 更多 >