2010-08-09 35 views
15

Antes de decir que es una pregunta duplicada, déjame explicarte (ya que he leído todos los hilos similares).Ocultar ventana de comandos en la aplicación C#

Mi aplicación tiene tanto de estas opciones:

procStartInfo.CreateNoWindow = true; 
    procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

y es también tiene WindowsApplication como tipo de salida.

La ventana negra STILL aparece cuando llamo a un comando de línea de comando. ¿Hay algo más que pueda hacer para ocultar la ventana? No sucede con todos los comandos, XCOPY es una situación donde la ventana negra se enciende. Esto solo sucede cuando el destino en el que estoy XCOPYing también contiene el archivo y me está preguntando si deseo reemplazarlo. Incluso si paso/Y, todavía parpadeará brevemente.

Estoy abierto a usar vbscript si eso ayuda, ¿pero alguna otra idea?

El cliente va a llamar a mi ejecutable y luego pasar en un ejemplo de comando de línea de comandos:

C:\MyProgram.exe start XCOPY c:\Test.txt c:\ProgramFiles\

Aquí está el código completo de la solicitud:

class Program 
{ 
    static void Main(string[] args) 
    {  
      string command = GetCommandLineArugments(args); 

      // /c tells cmd that we want it to execute the command that follows and then exit. 
      System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + command); 

      procStartInfo.RedirectStandardOutput = true; 
      procStartInfo.UseShellExecute = false; 

      // Do not create the black window. 
      procStartInfo.CreateNoWindow = true; 
      procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 

      System.Diagnostics.Process process = new System.Diagnostics.Process(); 
      process.StartInfo = procStartInfo; 
      process.Start(); 

     } 

    private static string GetCommandLineArugments(string[] args) 
    { 
     string retVal = string.Empty; 

     foreach (string arg in args) 
      retVal += " " + arg; 


     return retVal; 
    } 
} 
+0

se puede publicar el resto de su 'Process' /' c ProcessStartInfo' ¿oda? –

+3

@fletcher: Se establece en la pregunta que el tipo de salida es la aplicación de Windows y no la consola. Lo he probado con el tipo de salida establecido en la aplicación de Windows y funciona bien. @snow: Verificaría dos veces la configuración de OutputType. – nukefusion

+0

@fletcher ¡Ese es realmente el problema! Me gustaría que la ventana no se muestre en absoluto. – mint

Respuesta

9

El problema es que está utilizando cmd.exe. Solo su ventana de la consola se ocultará, no la ventana de la consola para el proceso que solicita que se inicie. No tiene mucho sentido usar cmd.exe, a menos que intente ejecutar algunos de los comandos que implementa. Como COPIA.

Todavía puede suprimir la ventana si necesita cmd.exe, tendrá que usar la opción/B para Iniciar. Tipo de inicio /? en el símbolo del sistema para ver las opciones. No es que sirva de ayuda, no puedes usar START COPY.

Hay una peculiaridad específica en xcopy.exe que también podría desanimarlo. No se ejecuta si no redirige la entrada. Simplemente no se ejecuta sin diagnóstico.

+0

el/B funcionó para el comando xcopy, eso podría ser todo lo que necesitamos para ser honestos. – mint

4

veo que está llamando cmd y luego pasar el comando como parámetros. En su lugar, llame directamente al comando

p.

System.Diagnostics.ProcessStartInfo procStartInfo = new System.DiagnosticsProcessStartInfo("xcopy", "<sourcedir> <destdir> <other parameters>"); 

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
+0

Probablemente debería haber indicado esto en la pregunta, pero el cliente pasará cualquier comando de línea de comando que quiera a mi programa, así que no puedo codificar hard xcopy, ¡aun así te repuse! – mint

+1

@Snow, aún puede hacer lo que dice, 'ProcessStartInfo procStartInfo = new ProcessStartInfo (Arg [0], String.Join (" ", Arg.Skip (1) .ToArray());' –

+0

@snow xcopy fue solo por ejemplo –

4

puede intentar añadir

process.StartInfo.UseShellExecute = false; 

a su proceso

+2

Solo para aclarar la respuesta. Necesitas 'process.StartInfo.UseShellExecute = falso; 'y' process.StartInfo.CreateNoWindow = false; '. Esas dos juntas ocultarán la ventana de proceso –

+1

@ Rémi: necesita' process.StartInfo.CreateNoWindow = true; ' – Sjoerd222888

+0

Recibo el error" El sistema no puede encontrar el archivo especificado. "Esto es a pesar de que he agregado el comando personalizado a la variable PATH del sistema. – Najeeb

0

que tenía una tarea similar - Es posible ocultar la ventana después de la creación a través de una llamada a la API. (En su caso, es posible que necesite un hilo de ayuda.)

[DllImport("user32.dll")] 
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

Si conoce el mango de la nueva ventana puede llamar

ShowWindow(hWnd, 0); 

0 oculta la ventana, La figura 1 muestra la ventana

Para obtener el identificador de la ventana echar un vistazo en:

pinvoke.net enumwindows(user32)

Cuestiones relacionadas