如何在Windows 8.1 / 10上可靠地窃取/重新获得MFC /桌面应用程序的焦点?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Windows 8.1 / 10上可靠地窃取/重新获得MFC /桌面应用程序的焦点?相关的知识,希望对你有一定的参考价值。
好的,我明白了:focus stealing is evil。或者至少它是99.9%的时间。但我真的需要在Windows 8上可靠地窃取焦点,到目前为止,我被大量坚持专注偷窃的人总是邪恶所阻挠。
场景:我们在运行Windows 8.1的普通PC上运行自定义应用程序(很快将成为Windows 10)。屏幕,键盘和鼠标距离地面约5米,距离叉车操作员真正不应爬的楼梯。他们拥有的一个输入设备是扩展器电缆上的数字键盘。他们需要做的一切都可以通过键盘完成...只要一些邪恶的程序没有窃取我们的应用程序的焦点,或者某些远程用户没有注销并留下另一个重点应用程序。
该应用程序本质上是一个最大化的桌面应用程序 - 它填充屏幕(但不是严格意义上的“全屏”或“最顶层”应用程序),因此允许其他应用程序在需要时出现在它前面。但是当鼠标空闲时,我们希望此应用程序在所有其他应用程序之前恢复其“正常”位置,以便它获得焦点并且数字键盘输入将可靠地工作。
在Windows 7上,使用SetForegroundWindow()
(由AllowSetForegroundWindow()
启用工作正常 - 应用程序可以返回到前面并恢复焦点。在Windows 8上,SetForegroundWindow()
只会导致任务栏图标闪烁,但应用程序不会重新获得焦点,迫使我们的用户爬楼梯...全键盘和鼠标太诱人了,他们不要按按钮,他们不应该,并且通常会出现混乱。
所以请先生:我的(MFC,桌面)应用程序可以在鼠标闲置1分钟后重新获得焦点,因为它或多或少是通常应该运行的唯一应用程序。如果允许,我们如何可靠地窃取它?
在数字键盘(RegisterHotKey
)上配置热键。
雷蒙德陈的Pressing a registered hotkey gives you the foreground activation love
在您调用RegisterHotKey函数注册热键后,当用户按下该热键时,窗口管理器将向您发送WM_HOTKEY消息,并且随之而来,您将获得前景爱。如果从热键处理程序中调用SetForegroundWindow,则前景窗口将根据您的指示进行更改。
我会这样试试:
- 在您的应用程序中设置计时器。这将在一个基础上检查
GetForegroundWindow
。 - 如果
GetForgroundWindow
不属于您的过程(GetWindowThreadProcessId
) - 如果前台窗口上的其他进程使用
AttachThreadInput
并将您的输入队列附加到另一个进程的输入队列。 - 现在使用
SetForegoundWindow
并再次分离线程输入。 - 现在,您可以根据需要使用
SetFocus
来控制程序的输入焦点。
可能的解决方案(主要限制):不做任何额外的事情;等待。
我们的一位服务技术人员观察到,在使用AllowSetForegroundWindow()
和SetForegroundWindow()
进行第三次或第四次尝试重新获得焦点时,Windows 8终于允许我们的应用程序重新获得关注。目前尚不清楚使这项工作的条件是什么,或者它是否可靠地工作,但我们现在已经观察到我们的应用程序从Chrome下方,另一个(自行开发的)MFC应用程序之下以及第三方应用程序之下重新获得关注 - 所有桌面应用程序。在将焦点交还给我们的(桌面)应用程序之前,每种情况需要大约3-4分钟才能完成。
但是,我们还没有目睹它从地铁应用程序中重新获得关注,我们也没有想到它(例如点击Windows键并让系统在“开始”屏幕上停留)。
在我们(受限制)的情况下,我们愿意冒险,我们的用户不会启动模糊我们的桌面应用程序的城域应用程序,至少在没有恢复我们的应用程序的情况下,因为他们的业务依赖于它。我们主要担心的是,我们的一位忙碌的服务技术人员将远程登录,分心,并不小心离开我们的桌面实用程序。等待3-4分钟似乎是这种特定情况的解决方案。
以上是关于如何在Windows 8.1 / 10上可靠地窃取/重新获得MFC /桌面应用程序的焦点?的主要内容,如果未能解决你的问题,请参考以下文章
Windows 8.1下安装Mac OS X 10.8虚拟机
在 Windows 8.1 上运行 Windows 10 通用应用
Delphi 4 Pro 能否在 Windows XP(或更高版本)上可靠地安装和使用?
Windows Phone 8.1 应用程序未完全在 Windows 10 设备上运行