拦截窗口试图窃取全球焦点的Windows

时间:2014-10-12 09:39:40

标签: windows keyboard focus usability

我是一名开发人员和长期使用Windows的用户,他对如何尽可能方便地使用我的系统感到非常着迷。

昨天我想到了一些在Windows中一直让我烦恼的事情,我认为这是理所当然的,我意识到我对它的工作原理有了更好的了解,我现在想知道是否有可能进行调整Windows就是这样工作的。

让我烦恼的是窗户偷东西的时候。例如,我可以为某个程序运行安装程序。当它工作时,我将切换到我的浏览器并浏览,也许在浏览器中输入一些文本到电子邮件中。然后突然安装程序完成了并且它的窗口窃取了焦点。现在我正在写一封电子邮件,所以我可能会按下恰好绑定到该安装程序上的按钮的键,并且然后调用该按钮,做一些我从未打算过的动作!

这对我来说非常烦人,因为我正在使用一个名为DexPot的多桌面程序,当一个窗口窃取焦点时,它也将自己带到我目前正在使用的桌面上,这可能真的很烦人,因为那时候我必须把它放回原来的桌面。

我对这个问题的理想解决方案是如何工作的:每次窗口试图窃取焦点时,我们都会拦截它,并且不要让它。我们展示了类似烤面包机消息的说法“Foobar安装程序需要关注,按Win-Whatever切换到它”。如果按键组合,它会切换到窗口。

问题是:是否有一种简单的方法来调整Windows以实现这一目标?我对Windows编程知之甚少。我知道AHK,如果有可能的话,那就太棒了。

1 个答案:

答案 0 :(得分:2)

不,没有一种简单的方法可以添加此行为,但Windows会尝试自动执行此操作。

理论上,在您积极使用其他应用时,应用无法窃取前景。不幸的是,在某些情况下,Windows无法区分应该更改前景的合法用户操作与不需要的前景 - 盗窃之间的区别。窗口管理器通常会在每个新版本的Windows中稍微收紧一些漏洞,但也需要确保应用程序可以在用户需要时进入前台,即使这种需求是间接表达的。

例如,当前前台进程启动的进程可以将窗口放入前台。这是必要的,以便当用户从资源管理器启动窗口时,新启动的进程可以打开其主窗口。此权限仅持续到下一个用户输入,因此如果应用程序启动缓慢并且您开始处理电子邮件,则应用程序可能会失去其前台权限,然后才能使用它们。

请参阅SetForegroundWindow function文档,了解能够将窗口设置为前台的流程要求列表。

还有一些应用程序专门利用这些要求窃取权限(通过加入前台队列或合成用户输入到自己),但我怀疑在您的安装程序场景中它是偶然的。

我不确定到底发生了什么,但我怀疑这个问题来自作为服务运行的安装程序,并在尝试在当前桌面上启动应用程序时意外窃取了前台权限。

从理论上讲,外部进程可以挂钩到前台系统来覆盖它并显示你的确认吐司,但是要做到正确并且需要大量低级代码会很棘手(我可能会从CbtHook)。在像AHK这样的脚本包中(假设你的意思是AutoHotKey)是不可能的,但是需要在每个正在运行的进程中注入本机C / C ++代码。