首页 > 解决方案 > 在 Catalina 中,`orderFront:` 使应用程序成为活动应用程序;我该如何防止这种情况?

问题描述

我有一个后台“监控”应用程序,它可以作为附件运行,也可以作为常规应用程序运行(用户选择取决于他们是否想在 Dock 中看到它)。

NSPanel该应用程序有几个显示后台任务进度的永不键实用程序窗口。当后台任务启动时,窗口使用orderFront:.

这多年来一直很有效。该窗口只会出现在活动应用程序后面的某个位置。

但是,从 Catalina (macOS 10.15) 开始,orderFront:会导致我的监控应用程序变得活跃,从而从用户的应用程序中窃取焦点。

这很糟糕,我想阻止它,但我似乎无法弄清楚如何。

标签: cocoanspanel

解决方案


问题不是-orderFront:

事实证明,在 Catalina 中,如果您将应用程序的激活策略更改为NSApplicationActivationPolicyRegular,在不久的将来(即不是立即)的某个时间点,该应用程序将成为活动应用程序,就像它已经启动一样。

让我震惊的是事件的顺序:激活策略发生了变化,窗口被创建并放在前面,然后应用程序变成了最前面的应用程序。

遗憾的是,由于无法拒绝成为最前面的应用程序,我唯一的解决方法是在更改激活策略时捕获当前活动的应用程序,等待激活,然后请求原始应用程序再次成为活动应用程序。丑陋,但在我的应用程序中,这应该每天只发生几次;这里希望用户在看屏幕的时候没有看屏幕。


推荐阅读