2015-06-27 39 views
-2

我写了一个简单的win32程序说abc.exe在子窗口中执行外部exe(C++,win32)

我已经在其中添加了一个按钮,点击哪个外部的exexyz.exe应该开始。

但是原始程序abc.exe应该不可访问,而xyz.exe正在运行。 (与消息框的情况相同,除非消息框关闭,否则父窗口保持不活动状态)

我该怎么办? 如果您可以发布示例代码,那将会很棒。

回答

1

您可以使用WaitForSingleObject(IIRC)等待新进程终止。在等待之前,您可以使窗口不可见(例如,通过ShowWindow)。首先检查成功启动。

0

当按下按钮,创建一个使用CreateProcess功能“xyz.exe”过程,并保存新进程的句柄(在PROCESS_INFORMATIONhProcess结构你CreateProcess传递)。

然后,您可以通过调用EnableWindow并将bEnable设置为FALSE来禁用'abc.exe'窗口。 在'abc.exe'的窗口过程中,处理WM_PAINT消息,请添加检查以查看'xyz.exe'过程是否仍在运行。您可以通过使用GetExitCodeProcess函数和先前保存的句柄并检查返回值是否为STILL_ACTIVE来完成此操作。如果“xyz.exe”进程不再处于活动状态,则可以再次使用EnableWindow启用“abc.exe”窗口。

+1

** - 1 **检查循环中的STILL_ACTIVE退出代码是非常危险的建议:当程序返回该值时,它会导致无限循环,该值只是值259.它是一个指示,但不是绝对的信号。相反,对于消息循环,您可以调用WaitForSingleObject并为超时参数传递0(零),并且不要仅在'WM_PAINT'上执行此操作!)。 –

+0

更好的选择是在您等待外部进程退出的时间内,将消息循环更改为使用'MsgWaitForMultipleObjects()'。但是,如果这不是一个选项,通过'SetTimer()'使用'WM_TIMER'会比使用'WM_PAINT'定期调用'WaitForSingleObject()'更合适。 –