我有一个后台进程运行在用户的macOS机器上。它的工作是检测任何应用程序何时在机器上启动。目前,我正在检测NSNotificationCenter
的NSWorkspaceDidLaunchApplicationNotification
事件。这对于检测应用程序何时刚刚启动(即应用程序当时没有实例已经运行)非常有效。
但是,在macOS上,如果我们点击左上角的红色十字按钮,它通常会关闭应用程序窗口,应用程序继续在后台运行。这一点也可以从dock上的应用图标及其下方的圆点指示器中看出。如果我点击dock上的app图标,然后启动它,NSWorkspaceDidLaunchApplicationNotification
事件不会被触发。
为了跟踪这些事件,我尝试使用NSWorkspaceDidActivateApplicationNotification
事件。使用这个事件,我能够检测到所有的应用程序启动场景。问题是,每当应用进入焦点时,这个事件就会被触发,例如使用命令+标签切换窗口,点击它的dock图标,在两个应用之间切换,…
是否有一种方法可以过滤掉这些触发器或识别导致触发器的操作?或者有一些其他的事件/方法,我可以听,提供所需的过滤触发器?我只想检测应用程序创建新窗口的场景。
你似乎想要的是两个不同的东西,正如在评论中提到的,这应该分别处理才能达到
-
当新进程启动时,检测应用程序启动。如果足够的话,你可以使用NSWorkspaceDidLaunchApplicationNotification(通常用于可视化用户应用程序),如果不够的话,你可以使用kqueue,甚至可以使用EndpointSecurity框架来统治它们。
-
跟踪已经启动的应用程序中的窗口。从视觉上看,如果应用程序dock图标下的白点在那里,则应用程序仍处于启动状态。该任务有一个可访问性框架,您可以跟踪窗口创建、窗口销毁事件,从目标进程id获取窗口计数,可见性状态等。它有点被抛弃了,自从可能发布以来没有更新,但在大多数情况下它会为你工作。