ShellExecuteEx() 启动的进程在终止时不会将焦点返回到父窗口

Posted

技术标签:

【中文标题】ShellExecuteEx() 启动的进程在终止时不会将焦点返回到父窗口【英文标题】:Process launched by ShellExecuteEx() doesn't return focus to parent window when terminated 【发布时间】:2013-07-12 05:20:01 【问题描述】:

我正在使用 ShellExecuteEx() 来启动一些程序,并使用 WaitForSingleObject() 来等待程序在 OnInitDialog()(MFC) 中终止。如您所知,在 OnInitDialog() 返回后出现主对话框。但是,在我的例子中,主对话框似乎并没有从 ShellExecuteEx() 在 OnInitDialog() 中创建的子进程中重新获得焦点。它出现了,但没有被激活,也没有出现在其他窗口的顶部。这有什么问题?

【问题讨论】:

请展示ShellExecuteEx周围的代码。 如果您的应用程序是基于对话框的,您可以在调用 WaitForSingleObject 之后放置“SetForegroundWindow()”。但如果它是非基于对话框的应用程序的对话框,那么我也没有找到解决方案。 【参考方案1】:

我通过将 ShellExecuteEx() 函数移出 OnInitDialog() 解决了我的问题。我将函数放在对话框变量的声明之前。我不知道为什么,但无论如何它解决了这个问题。

【讨论】:

OnInitDialog 在对话框可见之前运行。因此,当另一个程序结束时,您的对话框不符合焦点,因为它不可见。此外,您应该使用 MsgWaitForMultipleObjects 以便在等待时继续响应消息。否则,您可能会与您正在等待的程序发生死锁。

以上是关于ShellExecuteEx() 启动的进程在终止时不会将焦点返回到父窗口的主要内容,如果未能解决你的问题,请参考以下文章

将 unicode 参数传递给 ShellExecuteEx 中的子进程

VC++分别使用WinExecCreateProcessShellExecute和ShellExecuteEx来启动程序(附源码)

为啥 ShellExecuteEx 不返回进程句柄?

ShellExecuteEx 阻塞和异步调用进程的两种方法

ShellExecuteEx 并等待文件实际打开

如何用CMD命令终止和启动进程?