【发布时间】:2019-02-16 12:29:53
【问题描述】:
好的,我明白了:focus stealing is evil。或者至少是 99.9% 的时间。但我确实需要在 Windows 8 上可靠地窃取焦点,但到目前为止,我被一大群坚持窃取焦点总是邪恶的人所挫败。
场景:我们在运行 Windows 8.1(即将成为 Windows 10)的普通 PC 上运行自定义应用程序。屏幕、键盘和鼠标位于离地面大约 5m 的一些楼梯上,叉车操作员确实不应该爬上这些楼梯。他们拥有的一个输入设备是延长电缆上的数字键盘,位于他们的水平。他们需要做的所有事情都可以通过该键盘完成……只要某些恶意程序没有窃取我们应用程序的焦点,或者某个远程用户没有注销并让另一个应用程序获得焦点。
该应用程序本质上是一个最大化的桌面应用程序 - 它填满屏幕(但严格来说不是“全屏”或“最顶部”应用程序),因此允许其他应用程序在需要时出现在它的前面。但是当鼠标空闲时,我们希望这个应用程序在所有其他应用程序前面恢复其“正常”位置,以便它获得焦点并且数字键盘输入将可靠地工作。
在 Windows 7 上,使用 SetForegroundWindow()(由 AllowSetForegroundWindow() 启用可以正常工作 - 应用程序可以回到前面并恢复焦点。在 Windows 8 上,SetForegroundWindow() 只会导致任务栏图标闪烁,但应用程序没有重新获得焦点,迫使我们的用户爬楼梯......全键盘和鼠标太诱人了,他们不应该按下他们不应该按下的按钮,并且通常会出现混乱。
所以请先生:一旦鼠标空闲 1 分钟,我们的(MFC,桌面)应用程序能否夺回焦点,因为它或多或少是唯一应该正常运行的应用程序。如果允许,我们如何可靠地窃取它?
【问题讨论】:
-
@omatai 您可以尝试在上述 Windows 8.1 机器上将
HKEY_CURRENT_USER\Control Panel\Desktop\ForegroundLockTimeout设置为0。 -
我敢打赌这是一个 X/Y 问题:叉车操作员可能正在使用条形码扫描仪,通过键盘提供输入?出于这个原因,这几乎总是糟糕的设计选择。扫描仪是否有其他接口,如串口?它确实更容易,更易于维护,与其他软件更兼容(即使你的应用程序被使用了 99% 的时间,仍然有 1%)。我必须同意你试图避免的事情——不要这样做。
-
@zzxyz 如何以编程方式将焦点传递给我选择的应用程序是一个编程问题。这也可能是一个 su 问题。他有一个过去可以工作的 API,现在不再工作了。
-
@Yakk-AdamNevraumont - 我完全同意你所说的,并没有试图暗示这个问题在这里是错误的。我试图帮助扩大潜在答案的范围,因为我有一种预感——可能是错的——更多的人知道如何通过管理而不是编程解决这个问题(需要继续像以前一样运行的旧应用程序等)
-
太棒了:如果我可以做任何我想做的事,我想抢占焦点 :-) 我该怎么做那个?
标签: c++ windows winapi mfc windows-8.1