2010-08-09 24 views
15

Prima di pronunciare una domanda duplicata, lasciatemi spiegare (poiché ho letto tutti i thread simili).Nascondere la finestra di comando nell'applicazione C#

La mia applicazione ha entrambe queste impostazioni:

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

ed è anche ha WindowsApplication come il tipo di uscita.

La finestra nera STILL si presenta quando chiamo un comando da riga di comando. C'è qualcos'altro che posso fare per nascondere la finestra? Non succede per tutti i comandi, XCOPY è una situazione in cui la finestra nera lampeggia. Questo accade solo se la destinazione che sto XCOPYing contiene già il file e mi sta chiedendo se voglio sostituirlo. Anche se passassi in/Y lampeggerà ancora brevemente.

Sono aperto all'utilizzo di vbscript se questo sarà di aiuto, ma qualche altra idea?

Il cliente chiamerà il mio eseguibile e poi passare in un esempio di comando riga di comando:

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

Ecco il codice completo dell'applicazione:

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

puoi pubblicare il resto della tua 'processo' /' ProcessStartInfo' c ode? –

+3

@fletcher: Nella domanda è indicato che il tipo di output è Applicazione Windows e non console. L'ho provato con il tipo di output impostato sull'app Windows e funziona perfettamente. @snow: Vorrei ricontrollare le impostazioni OutputType. – nukefusion

+0

@fletcher Questo è in realtà il tipo di problema! Vorrei che la finestra non si visualizzasse affatto! – mint

risposta

9

Il problema è che si sta utilizzando cmd.exe. Solo la sua finestra della console verrà nascosta, non la finestra della console per il processo che si chiede di avviare. Non ha molto senso usare cmd.exe, a meno che tu non stia cercando di eseguire alcuni dei comandi che implementa da solo. Come per la copia.

È ancora possibile sopprimere la finestra se è necessario cmd.exe, sarà necessario utilizzare l'opzione/B per Avvio. Digitare start /? al prompt dei comandi per vedere le opzioni. Non che sia d'aiuto, non puoi usare START COPY.

C'è una stranezza specifica in xcopy.exe che potrebbe scoraggiare anche voi. Lo fa non eseguito se non si reindirizza anche l'input. Non riesce a funzionare senza diagnostica.

+0

il/B ha funzionato per il comando xcopy, che potrebbe essere tutto ciò che dobbiamo essere onesti. – mint

4

vedo che si sta chiamando cmd e quindi passando il comando come parametri. Chiamate invece direttamente il comando

ad es.

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

procStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
+0

Probabilmente avrei dovuto dire questo nella domanda, ma il client passerà in qualsiasi comando della riga di comando che vuole al mio programma, quindi non posso hardcript xcopy, comunque ti ho comunque repped! – mint

+1

@Snow, puoi ancora fare ciò che dice, 'ProcessStartInfo procStartInfo = new ProcessStartInfo (Arg [0], String.Join (" ", Arg.Skip (1) .ToArray());' –

+0

@snow xcopy era solo ad esempio –

4

Si può provare l'aggiunta di

process.StartInfo.UseShellExecute = false; 

al vostro processo

+2

Giusto per chiarire la risposta.È necessario 'process.StartInfo.UseShellExecute = false; 'e' process.StartInfo.CreateNoWindow = false; '. Quei due insieme nasconderanno la finestra del processo –

+1

@ Rémi: hai bisogno di' process.StartInfo.CreateNoWindow = true; ' – Sjoerd222888

+0

Ho ricevuto l'errore" Il sistema non riesce a trovare il file specificato. "Questo è anche se ho aggiunto il comando personalizzato alla variabile PATH di sistema. – Najeeb

0

Ho avuto un compito simile - E 'possibile nascondere la finestra dopo la creazione tramite una chiamata API. (Nel tuo caso forse hai bisogno di un thread di supporto.)

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

Se si conosce la maniglia della nuova finestra è possibile chiamare

ShowWindow(hWnd, 0); 

0 nasconde la finestra, 1 mostra la finestra

per ottenere l'handle della finestra dare un'occhiata a:

pinvoke.net enumwindows(user32)

Problemi correlati