2011-01-20 16 views
11

(Ho cercato risposte SO e non ho trovato alcuna soluzione chiara a questo problema.)Come eseguire i programmi della console figlio senza mostrare la finestra della console dal programma della GUI Win32?

Sto lavorando a un programma MFC GUI. Questo programma esegue vari programmi figlio, inclusi il programma della console e lo script di comando della shell (.cmd).

Inizialmente visualizzava una finestra della GUI e una finestra della console (creata con AllocConsole) perché ci sono molti output della console dai processi figli. Ma molti utenti si sono lamentati della finestra della console, quindi abbiamo deciso di nascondere la finestra della console.

In primo luogo provato come di seguito:

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

Va bene, senza finestra della console, ma ci sono sfarfallio visibile al momento della creazione della console. Ho provato diverse opzioni CreateProcess per la creazione di processi figlio per impedire la visualizzazione della finestra della console, ma non sono riuscito a breve e penso che sia praticamente impossibile.

Non è un grosso problema. Possiamo ignorare lo sfarfallio temporaneo della finestra all'avvio.

Ma è davvero impossibile nascondere completamente la finestra della console figlio?

+1

Si prevede che il tremolio; stai creando una finestra della console e poi la nascondi. La domanda è: perché crei una finestra di console, se non vuoi che l'utente la veda? Cosa c'è di sbagliato in 'ShellExecute' o' CreateProcess'? –

+2

@Code Gray Questo programma CreateProcess diversi programmi della console. Senza AllocConsole, verrà creata una finestra della console separata e incontrollabile, che verrà distrutta in continuazione. – 9dan

+0

Non ho idea di cosa significhi. Stai utilizzando diversi programmi di console * diversi * e se usi 'CreateProcess' ogni volta creerai una nuova finestra di console invece di riutilizzare quella vecchia? Sì ... così? Cosa c'è che non va? –

risposta

15

Setup lo STARTUPINFO come questo per la chiamata 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; 
+3

Grazie! Funziona perfettamente quando si usa CreateProcess con l'opzione CREATE_NO_WINDOW. – 9dan

+2

@Cody Gray: il problema è che 'CreateProcess' da solo è insufficiente, non che sia sbagliato.Anche il reindirizzamento I/O e il flag 'CREATE_NO_WINDOW' erano necessari. – MSalters

+1

In 'C#' usa 'ProcessStartInfo' e imposta' WindowStyle = ProcessWindowStyle.Hidden'. Praticamente lo stesso su .NET Framework. – Bitterblue

Problemi correlati