2011-01-20 176 views
11

(我搜索了答案,發現沒有明確的解決方案來解決這個問題。)如何在不顯示Win32 GUI程序的控制檯窗口的情況下執行子控制檯程序?

我正在開發MFC GUI程序。該程序運行各種子程序,包括控制檯程序和shell命令腳本(.cmd)。

最初,它顯示的一個GUI窗口和一個控制檯窗口(帶AllocConsole創建),因爲有從子進程輸出許多控制檯。但許多用戶抱怨控制檯窗口,所以我們決定隱藏控制檯窗口。

首先試圖象下面這樣:

if (AllocConsole()) 
{ 
    ::ShowWindow(::GetConsoleWindow(), SW_HIDE); 
} 

好吧,沒有控制檯窗口,但也有在控制檯創建時可見閃爍。 我試過子進程創建幾個CreateProcess選項,以完全防止控制檯窗口中的表現,但在短暫失敗,我認爲這幾乎是不可能的。

這不是什麼大不了的事。我們可以忽略啓動時的臨時窗口閃爍。

這是真的不可能完全隱藏子控制檯窗口?

+1

閃爍預期;你正在創建一個控制檯窗口,然後隱藏它。問題是,如果你不想讓用戶看到它,爲什麼你會創建一個控制檯窗口? `ShellExecute`或`CreateProcess`有什麼問題? – 2011-01-20 04:58:17

+2

@Code Grey這個程序CreateProcess各種控制檯程序。如果沒有AllocConsole,將會創建分離且無法控制的控制檯窗口,並一直銷燬。 – 9dan 2011-01-20 05:07:30

回答

15

設置的STARTUPINFO喜歡本作的CreateProcess的呼叫:

STARTUPINFO si = { 0 }; 
    si.cb = sizeof(si); 
    si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 
    si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); 
    si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
    si.hStdError = GetStdHandle(STD_ERROR_HANDLE); 
    si.wShowWindow = SW_HIDE; 
相關問題