当子进程之一关闭时,如何确保我的进程获得焦点?

时间:2018-10-12 16:21:11

标签: windows

一些背景

我们的应用程序(AppA)正在调用第三方应用程序(AppB)。我们正在将AppB的窗口模拟为应用程序的模式。

pseudo
while AppB_Running
  If AppA_focused
    SetForeGroundWindow(AppB_Hwnd)
  HandleMessage
SetForegroundWindow(AppA_HWnd)

这已经进行了好多年没有发生任何事件,也就是说,直到我们开始推出Windows 10为止。我们开始收到报告说,当我们关闭AppB时,某个时候某个随机应用程序(AppC)成为了焦点(实际上,考虑到我们用户的技术专业知识方面,报告的内容更像“关闭AppB杀死AppA”,但我离题了。可以偶尔在开发机上重现该行为(<5%)(但在调试时还没有...)

到目前为止,测试结果表明AppC是在AppA之前关注的应用程序。

有没有一种方法可以确保在AppB关闭时AppA重新获得焦点?

额外笔记

即使AppA仅失去对AppB的关注,也可以重现该问题。 (AppA启动后,AppC永远不会被关注)

1 个答案:

答案 0 :(得分:0)

虽然这不能直接回答我最初的问题,但确实可以为该问题提供更多的见解,并且可能对其他人有用。

问题的一部分是对我们的监督。更具体地说,我们获得AppB_HWnd的方式。我们基本上选择了遇到的第一个顶级窗口。在我们当前的测试案例中,该窗口恰好是不可见的窗口(“ MSCTFIME UI”)。在不可见窗口上调用SetForegroundWindow似乎本身不会引起问题,Windows似乎只是将进程的可见窗口之一放在前面。当所说的进程没有可见的窗口时,事情似乎出现了问题。在我们的情况下,通常发生在AppB主窗口关闭到流程结束之间。

所以...不要在不可见的窗口上调用SetForegroundWindow

至于为什么我们在Win7中没有遇到任何麻烦?也许第一个窗口总是可见的。又或者说SetForegroundWindow的行为在那时有所不同。