Ocultar la ventana de la consola de Process.Start C #

102

Estoy tratando de crear un proceso en una máquina remota usando la clase System.Diagnostics.Process. Puedo crear un proceso. Pero el problema es que crear un servicio lleva mucho tiempo y se muestra la ventana de la consola. Otra cosa molesta es que la ventana de la consola se muestra en la parte superior de mi formulario de Windows y no puedo hacer ninguna otra operación en ese formulario. He configurado todas las propiedades como CreateNoWindow = true,

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

pero aún muestra la ventana de la consola. incluso he redirigido la salida y los errores a una secuencia separada, pero no tuve suerte.

¿Hay alguna otra forma de ocultar la ventana de la consola? Por favor, ayúdame .

Aquí está la parte de mi código que utilicé para ejecutar el comando sc.

Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = "sc";
proc.StartInfo.Arguments = string.Format(@"\\SYS25 create MySvc binPath= C:\mysvc.exe");
proc.StartInfo.RedirectStandardError = false;
proc.StartInfo.RedirectStandardOutput = false;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
proc.WaitForExit();
Prasad
fuente
¿Ha intentado configurar proc.StartInfo.RedirectedStandardOutput = true? He conseguido que esto funcione con una aplicación de Windows.
poy
¿Alguna solución final con una muestra de código fuente completa que funcione?
Kiquenet
En una aplicación de consola de Windows , simplemente configurar UseShellExecute, sin redirección o cualquier otra cosa, funcionó para mí. Vea aquí .
Paul
En cuanto a la apertura de la ventana de la consola y el bloqueo del formulario, debe ejecutar el proceso como una tarea o en un nuevo hilo
Ryan Dooley
¿Por qué te pones UseShellExecutey CreateNoWindowdos veces?
Mike Lowery

Respuestas:

119

Tuve un problema similar al intentar iniciar un proceso sin mostrar la ventana de la consola. Probé con varias combinaciones diferentes de valores de propiedad hasta que encontré una que mostraba el comportamiento que quería.

Aquí hay una página que detalla por qué la UseShellExecutepropiedad debe establecerse como falsa.
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

En la sección Comentarios en la página:

Si la propiedad UseShellExecute es verdadera o las propiedades UserName y Password no son nulas, el valor de la propiedad CreateNoWindow se ignora y se crea una nueva ventana.

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = fullPath;
startInfo.Arguments = args;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;

Process processTemp = new Process();
processTemp.StartInfo = startInfo;
processTemp.EnableRaisingEvents = true;
try
{
    processTemp.Start();
}
catch (Exception e)
{
    throw;
}
John Bartels
fuente
2
¿Le gustaría agregar algunos detalles adicionales? El por qué esto funciona en lugar del cómo .
aqua
2
¿Es porque la salida estándar está obligando a la ventana a existir?
Denise Skidmore
1
Y aparentemente no puede redirigir la salida estándar sin configurarstartInfo.UseShellExecute = false;
Denise Skidmore
1
Tengo curiosidad por qué, en esta otra respuesta usaron UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore
9
Nunca entenderé por qué las personas detectan una excepción que simplemente están lanzando nuevamente de todos modos.
Blindy
54

Tuve mala suerte con esta respuesta, con el proceso (Wix light.exe) básicamente saliendo a almorzar y no llegando a casa a tiempo para la cena. Sin embargo, lo siguiente funcionó bien para mí:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process
John Lockwood
fuente
2
Funcionó para mí, ¡agradable y simple!
J c
2
Esta debería ser realmente la respuesta aceptada. Funciona de maravilla.
Eternal21
2
CreateNoWindow = trueno funcionó para mí, esto sí :)
Stefan Monov
3
Funciona solo para aplicaciones con ventana, la aplicación de consola aún muestra la ventana
Geograph
18

Esto debería funcionar, inténtalo;


Agregue una referencia del sistema.

using System.Diagnostics;

Luego use este código para ejecutar su comando en una ventana CMD oculta.

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.Arguments = "Enter your command here";
cmd.Start();
Roshana Pitigala
fuente
11

Esto no muestra la ventana:

Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cmd.StartInfo.CreateNoWindow = true;

...
cmd.Start();
Leonardo Rignanese
fuente