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