C++ 在子窗口(C+;+;,win32)中执行外部exe
我已经写了一个简单的win32程序,比如abc.exe 我在其中添加了一个按钮,单击该按钮可以启动外部exe比如C++ 在子窗口(C+;+;,win32)中执行外部exe,c++,winapi,C++,Winapi,我已经写了一个简单的win32程序,比如abc.exe 我在其中添加了一个按钮,单击该按钮可以启动外部exe比如xyz.exe 但是当运行xyz.exe时,应无法访问原始程序,即abc.exe。(与消息框的情况相同,父窗口保持不活动状态,除非消息框关闭) 我该怎么做呢? 如果您可以发布一个示例代码,那就太好了。您可以使用WaitForSingleObject(IIRC)等待新进程终止。您可以在等待之前使窗口不可见(例如,通过ShowWindow)。首先检查成功启动。按下按钮后,使用CreateP
xyz.exe
但是当运行xyz.exe
时,应无法访问原始程序,即abc.exe
。(与消息框的情况相同,父窗口保持不活动状态,除非消息框关闭)
我该怎么做呢?
如果您可以发布一个示例代码,那就太好了。您可以使用
WaitForSingleObject
(IIRC)等待新进程终止。您可以在等待之前使窗口不可见(例如,通过ShowWindow
)。首先检查成功启动。按下按钮后,使用CreateProcess
函数创建“xyz.exe”进程,并保存新进程”句柄(process\u信息中的hProcess
结构中传递的CreateProcess
)
然后,您可以通过调用EnableWindow
禁用“abc.exe”窗口,并将bEnable
设置为FALSE
。
在“abc.exe”的窗口过程中,处理WM_PAINT
消息的地方添加一个检查以查看“xyz.exe”进程是否仍在运行。您可以使用前面保存的句柄使用GetExitCodeProcess
函数,并检查返回值是否仍处于活动状态。如果“xyz.exe”进程不再处于活动状态,则可以再次使用EnableWindow
启用“abc.exe”窗口−1检查循环中的仍处于活动状态
退出代码是非常危险的建议:当程序返回该值时,它会导致无限循环,而该值正好是259。这是一个指示,但不是一个确定的火灾信号。相反,对于消息循环,您可以调用WaitForSingleObject
并传递0(零)作为超时参数(不要仅在WM_PAINT
!)上执行此操作)。更好的选择是在等待外部进程退出期间,将消息循环更改为使用MsgWaitForMultipleObjects()
。但如果这不是一个选项,那么通过SetTimer()
使用WM\u TIMER
比使用WM\u PAINT
定期调用WaitForSingleObject()
更合适。