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

oma*_*tai 6 c++ windows winapi mfc windows-8.1

好吧,我明白了:专注偷窃是邪恶的.或者至少它是99.9%的时间.但我真的需要在Windows 8上可靠地窃取焦点,到目前为止,我被大量坚持专注偷窃的人总是邪恶所挫败.

场景:我们在运行Windows 8.1的普通PC上运行自定义应用程序(很快将成为Windows 10).屏幕,键盘和鼠标距离地面约5米,距离叉车操作员真正不应爬的楼梯.他们拥有的一个输入设备是扩展器电缆上的数字键盘.他们需要做的一切都可以通过键盘完成...只要一些邪恶的程序没有窃取我们的应用程序的焦点,或者某些远程用户没有注销并留下另一个重点应用程序.

该应用程序本质上是一个最大化的桌面应用程序 - 它填充屏幕(但不是严格意义上的"全屏"或"最顶层"应用程序),因此允许其他应用程序在需要时出现在它前面.但是当鼠标空闲时,我们希望此应用程序在所有其他应用程序之前恢复其"正常"位置,以便它获得焦点并且数字键盘输入将可靠地工作.

在Windows 7上,使用SetForegroundWindow()(通过AllowSetForegroundWindow()正常工作启用- 应用程序可以返回到前面并恢复焦点.在Windows 8上,SetForegroundWindow()只会导致任务栏图标闪烁,但应用程序无法重新获得焦点,迫使我们的用户爬上楼梯......全键盘和鼠标太诱人了他们不要按下按钮他们不应该,并且通常会出现混乱.

所以请先生:我的(MFC,桌面)应用程序可以在鼠标闲置1分钟后重新获得焦点,因为它或多或少是通常应该运行的唯一应用程序.如果允许,我们如何可靠地窃取它?

xMR*_*MRi 0

我会这样尝试:

  1. 在您的应用程序中设置一个计时器。GetForegroundWindow定期检查。
  2. 如果GetForgroundWindow不属于您的进程 ( GetWindowThreadProcessId)
  3. 如果前台窗口上有不同的进程,请使用AttachThreadInput并将输入队列附加到其他进程的输入队列。
  4. 现在再次使用SetForegoundWindow并分离线程输入。
  5. 现在您可以SetFocus根据需要使用来控制您的程序的输入焦点。