在 Visual C++ 中切换子进程窗口可见性而不重新启动子进程

Posted

技术标签:

【中文标题】在 Visual C++ 中切换子进程窗口可见性而不重新启动子进程【英文标题】:Toggle child process window visibility in Visual C++ without relaunching the child 【发布时间】:2017-11-27 20:45:16 【问题描述】:

使用 Visual Studio 2017。

我用

siStartInfo.dwFlags &= STARTF_USESHOWWINDOW;

siStartInfo.wShowWindow = SW_HIDE;

创建一个带有隐藏窗口的子进程(通过 CreateProcess())。效果很好。

如果可能的话,我希望能够切换子进程窗口的可见性状态,创建后,从主程序按需(按下例如一个按钮)。我想控制子进程的窗口可见性而不通过 CreateProcess() 重新启动它。

修改子进程代码不是一种选择——它可以是许多不同的程序,不一定有可用的源代码。

提前致谢。

【问题讨论】:

siStartInfo.dwFlags |= STARTF_USESHOWWINDOW;需要使用 不清楚visual-studio 与这一切的关系。子进程可以完全忽略启动信息。 您必须找到子进程窗口并显示它。 【参考方案1】:

如果您知道子进程的唯一窗口类或标题,则可以使用FindWindow() 查找该窗口。

对于更通用的方法,使用EnumWindows() 枚举所有***窗口。对每个窗口调用GetWindowThreadProcessId()检查是否属于子进程。

致电ShowWindow() 以切换可见性。

【讨论】:

如果生成的应用程序是单线程的(或者至少,有问题的窗口属于主线程),请考虑使用EnumThreadWindows() 而不是EnumWindows()+GetWindowThreadProcessId()CreateProcess()返回新进程的主线程的线程ID。

以上是关于在 Visual C++ 中切换子进程窗口可见性而不重新启动子进程的主要内容,如果未能解决你的问题,请参考以下文章

C++中如何实现子进程打开控制台窗口

visual c++ 中 怎样把子窗口传值到父窗口?

visual C++ 创建一个窗口却无法显示窗口的原因是啥?

(Visual C++) 从线程获取 PID

如何从 MDI Visual C++ 2008 应用程序更改子窗口的背景

Visual C++ 编程技巧之二