2011-01-20 19 views
11

(He buscado respuestas SO y no encontró solución clara a este problema.)¿Cómo ejecutar los programas de la consola hija sin mostrar la ventana de consola desde el programa GUI de Win32?

Estoy trabajando en un programa MFC GUI. Este programa ejecuta varios programas secundarios, incluido el programa de consola y el script de comandos del shell (.cmd).

Inicialmente mostraba una ventana de GUI y una ventana de consola (creada con AllocConsole) porque hay muchos resultados de consola desde los procesos secundarios. Pero muchos usuarios se quejaron de la ventana de la consola, por lo que decidimos ocultar la ventana de la consola.

En primer lugar trataron como a continuación:

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

bien, no hay ventana de la consola, pero hay oscilaciones visibles en el momento de la creación de la consola. He intentado varias opciones de CreateProcess para la creación de procesos secundarios para evitar que se muestre la ventana de la consola por completo, pero falló en breve y creo que es prácticamente imposible.

No es un gran problema. Podemos ignorar el parpadeo temporal de la ventana al inicio.

¿Pero es realmente imposible ocultar la ventana de la consola del niño por completo?

+1

El parpadeo se espera; estás creando una ventana de consola y luego ocultándola. La pregunta es, ¿por qué creas una ventana de consola si no quieres que el usuario la vea? ¿Qué pasa con 'ShellExecute' o' CreateProcess'? –

+2

@Code Gray Este programa CreateProcess varios programas de consola. Sin AllocConsole, se creará una ventana de consola separada e incontrolable, destruida todo el tiempo. – 9dan

+0

No tengo idea de lo que eso significa. ¿Está ejecutando varios * programas * de consola, y si usa 'CreateProcess' cada vez creará una nueva ventana de consola en lugar de reutilizar la anterior? ¿Si lo? ¿Qué está mal con eso? –

Respuesta

15

Configuración del STARTUPINFO así durante la llamada 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

¡Gracias! Funciona perfectamente cuando se usa CreateProcess con la opción CREATE_NO_WINDOW. – 9dan

+2

@Cody Gray: el problema es que 'CreateProcess' por sí mismo es insuficiente, no es que esté mal.La redirección de E/S y el indicador 'CREATE_NO_WINDOW' también fueron necesarios. – MSalters

+1

En 'C#' use 'ProcessStartInfo' y configure' WindowStyle = ProcessWindowStyle.Hidden'. Más o menos lo mismo .NET Frameworked. – Bitterblue

Cuestiones relacionadas