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

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

昨天我想到了一些在Windows中一直让我厌烦的东西,而且我认为这是理所当然的,我意识到我对它的工作原理有了一个更好的主意,现在我想知道是否可以调整Windows来工作像那样。

惹恼我的东西是windows偷点的时候。 例如,我可以运行某个程序的安装程序。 当它工作时,我会切换到我的浏览器并浏览,也许在浏览器中input一些文本到电子邮件中。 然后突然,安装程序完成,它的窗口窃取焦点。 现在我正在编写一封电子邮件,所以我可能会按下一个键,该键恰好绑定到该安装程序上的一个button,然后调用该button,执行一些我从来没有打算发生的操作!

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

我对这个问题的理想解决scheme是如何工作的:每当一个窗口试图窃取焦点时,我们就拦截这个问题,而不要这么做。 我们展示了一个类似于烤面包机的消息:“Foobar安装程序需要关注焦点,按Win-Whatever切换到它”。 如果和当你按下组合键,它切换到窗口。

问题是:是否有简单的方法来调整Windows来实现这一目标? 我对Windows编程知之甚less。 我知道AHK,如果有可能的话,那很好。

不,没有简单的方法来添加此行为,但Windows会自动执行此操作。

理论上,应用程序不应该能够在您正在使用其他应用程序的情况下窃取前台。 不幸的是,有些情况下,Windows无法区分应该改变前景和不必要的前景盗用的合法用户操作。 窗口管理器通常会在每一个新版本的Windows中增加一些漏洞,但是也需要确保应用程序在用户需要的时候能够走到前台,即使这个愿望是间接表达的。

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

请参阅SetForegroundWindow函数文档以获取进程的需求列表,以便能够将窗口设置为前景。

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

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

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