2011-03-21 22 views
67

Estoy intentando crear un proceso en una máquina remota usando System.Diagnostics.Process class. Puedo crear un proceso. Pero el problema es que la creación de 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 puesto todas las propiedades como CreateNoWindow = true,Ocultar la ventana de la consola desde Process.Start C#

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden 

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

¿Hay alguna otra manera 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(); 
+0

¿Has probado la configuración 'proc.StartInfo.RedirectedStandardOutput = true'? He conseguido que esto funcione con una aplicación de Windows. – Andrew

+0

cualquier solución final con código fuente completo de muestra trabajando al respecto? – Kiquenet

+0

En una aplicación * de Windows *, simplemente estableciendo UseShellExecute - sin redireccionamiento o cualquier otra cosa - funcionó para mí. Ver [aquí] (https://stackoverflow.com/a/47781912/63209). – Paul

Respuesta

86

tuve un problema similar cuando se intenta iniciar un proceso sin mostrar la ventana de la consola. Probé con varias combinaciones diferentes de valores de propiedad hasta que encontré uno que exhibía el comportamiento que quería.

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

Bajo sección de observaciones en la página:

Si la propiedad UseShellExecute es verdadero o el nombre del usuario y propiedades de contraseña no son nulos, el valor CreateNoWindow propiedad 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; 
} 
+1

¿Desea agregar algunos detalles adicionales? El ** por qué ** esto funciona en lugar del ** cómo **. – aqua

+1

¿Es porque la salida estándar está obligando a que exista la ventana? –

+1

Y aparentemente no se puede redirigir la salida estándar sin configurar 'startInfo.UseShellExecute = false; ' –

36

que he tenido mala suerte con esta respuesta, con el proceso (Wix light.exe) esencialmente de salir a comer y no volver 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 
+2

Funcionó para mí, ¡agradable y simple! –

+2

Esto realmente debería ser la respuesta aceptada. Funciona de maravilla. – Eternal21

+4

No funciona, el proceso aún muestra la ventana. – Omarrrio

9

Esto debería funcionar, porque funcionó para mí. Entonces intenta;

Agregue una referencia del sistema.

using System.Diagnostics; 

A continuación, utiliza este código para ejecutar el comando en una ventana CMD hiden.

Process cmd = new Process(); 
cmd.StartInfo.FileName = "cmd.exe"; 
cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
cmd.StartInfo.Arguments = "Enter your command here"; 
cmd.Start(); 
Cuestiones relacionadas