我寫了一個簡單的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()'更合適。 –