如何在Windows 8.1 / 10上可靠地窃取/重新获得MFC /桌面应用程序的焦点?

时间:2018-09-11 23:31:23

标签: c++ windows winapi mfc windows-8.1

好的,我明白了:focus stealing is evil。或者至少是99.9%的时间。但是我确实需要在Windows 8上可靠地窃取焦点,到目前为止,成群的人们坚持认为窃取焦点总是 邪恶。

方案:我们在运行Windows 8.1(即将成为Windows 10)的普通PC上运行自定义应用程序。屏幕,键盘和鼠标位于离地面约5m的位置,这是叉车操作员真正不应该爬的台阶。他们拥有的一个输入设备是数字键盘,其扩展电缆水平向下。他们需要做的所有事情都可以从该键盘执行...只要某些恶意程序没有夺走我们应用程序的焦点,或者某个远程用户没有注销并让另一个具有焦点的应用程序。

该应用程序本质上是一个最大化的桌面应用程序-它充满了整个屏幕(但严格来说不是“全屏”或“最上面”的应用程序),因此允许其他应用程序在需要时显示在其前面。但是,当鼠标闲置时,我们希望该应用程序在所有其他应用程序之前恢复其“正常”位置,以便它获得焦点并且数字小键盘输入将可靠地工作。

在Windows 7上,使用SetForegroundWindow()(由AllowSetForegroundWindow()启用可以很好地工作-可以将应用程序放回最前面并恢复焦点。在Windows 8上,SetForegroundWindow()仅导致任务栏图标闪烁,但应用程序无法重新获得焦点,迫使我们的用户爬上楼梯...在这里,完整的键盘和鼠标极易吸引他们不要按下不该按下的按钮,并且通常会出现混乱。

因此,先生,请问:一旦鼠标闲置1分钟,我们的(MFC,桌面)应用程序能否恢复焦点,因为它或多或少是正常情况下仍应运行的唯一应用程序。如果允许的话,我们如何可靠地窃取它?

2 个答案:

答案 0 :(得分:1)

在数字小键盘( this.httpClient.get("http://localhost:8000").subscribe(response => { // do some action }); )上配置热键。

Pressing a registered hotkey gives you the foreground activation love,作者:Raymond Chen

  

调用RegisterHotKey函数注册热键后,   当用户按下时,窗口管理器将向您发送WM_HOTKEY消息   该热键,以及它,您将获得前台的爱。如果   您从热键处理程序内部调用SetForegroundWindow,   前景窗口会根据您的指示进行更改。

答案 1 :(得分:0)

可能的解决方案(有主要限制):什么都不做;等待。

我们的一名服务技术人员观察到,在Windows 7上使用AllowSetForegroundWindow()SetForegroundWindow()进行第三次或第四次尝试重新获得焦点时,Windows 8最终允许我们的应用程序重新获得了焦点。目前尚不清楚什么条件可以使它起作用,或者它能否可靠地起作用,但是我们现在已经观察到我们的应用程序重新获得了焦点,这些焦点来自Chrome,另一个(自行开发的)MFC应用程序,以及第三方应用程序。 -所有桌面应用程序。在每种情况下,将焦点移回到我们的(桌面)应用程序大约需要3-4分钟。

但是,我们还没有看到它从都市应用程序下面重新获得关注,也没有期望(例如,按Windows键并使系统在“开始”屏幕上徘徊)。

在我们(​​受限制的)情况下,我们愿意冒险赌博:我们的用户不会启动会掩盖我们的桌面应用程序的Metro应用程序,至少不会还原我们的应用程序,因为他们的业务依赖它。我们主要担心的是,我们忙碌的服务技术人员之一将远程登录,分心,并且不小心将重点放在我们的桌面实用程序之一上。等待3-4分钟似乎可以解决此特定情况。