2015-06-27 38 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()'更合適。 –