Nascondi la finestra della console da Process.Start C #


102

Sto cercando di creare un processo su una macchina remota utilizzando la classe System.Diagnostics.Process. Sono in grado di creare un processo. Ma il problema è che la creazione di un servizio richiede molto tempo e viene visualizzata la finestra della console. Un'altra cosa fastidiosa è che la finestra della console viene visualizzata sopra il mio modulo di Windows e non posso eseguire altre operazioni su quel modulo. Ho impostato tutte le proprietà come CreateNoWindow = true,

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

ma mostra ancora la finestra della console. anche io ho reindirizzato l'output e gli errori per separare il flusso ma senza fortuna.

C'è un altro modo per nascondere la finestra della console? Per favore aiutatemi .

Ecco la parte del mio codice che ho usato per eseguire il 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();

Hai provato l'impostazione proc.StartInfo.RedirectedStandardOutput = true? Ho ottenuto che funzioni con un'applicazione Windows.
poy

qualsiasi soluzione finale con un esempio di codice sorgente completo che ci lavora?
Kiquenet

In un'app della console Windows , la semplice impostazione di UseShellExecute - senza reindirizzamento o altro - ha funzionato per me. Vedi qui .
Paul

Per quanto riguarda l'apertura della finestra della console e il blocco del modulo, è necessario eseguire il processo come attività o su un nuovo thread
Ryan Dooley

Perché stai impostando UseShellExecutee CreateNoWindowdue volte?
Mike Lowery

Risposte:


119

Ho riscontrato un problema simile durante il tentativo di avviare un processo senza visualizzare la finestra della console. Ho provato con diverse combinazioni di valori di proprietà fino a quando non ne ho trovato uno che mostrava il comportamento che volevo.

Ecco una pagina che spiega perché la UseShellExecuteproprietà deve essere impostata su false.
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

Nella sezione Osservazioni a pagina:

Se la proprietà UseShellExecute è true o le proprietà UserName e Password non sono null, il valore della proprietà CreateNoWindow viene ignorato e viene creata una nuova finestra.

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;
}

2
Vuoi aggiungere qualche dettaglio aggiuntivo? Il perché funziona piuttosto che il come .
aqua

2
È perché lo standard output obbliga la finestra a esistere?
Denise Skidmore

1
E a quanto pare non è possibile reindirizzare lo standard output senza impostarestartInfo.UseShellExecute = false;
Denise Skidmore

1
Sono curioso di sapere perché, in quest'altra risposta, hanno usato UseShellExecute = true? stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore

10
Non capirò mai perché le persone colgono un'eccezione che stanno rilanciando comunque.
Blindy

54

Ho avuto sfortuna con questa risposta, con il processo (Wix light.exe) essenzialmente andando a pranzo e non tornando a casa in tempo per la cena. Tuttavia, quanto segue ha funzionato bene per me:

Process p = new Process();
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
// etc, then start process

2
Ha funzionato per me - bello e semplice!
J c

2
Questa dovrebbe essere davvero la risposta accettata. Funziona come un fascino.
Eterna

2
CreateNoWindow = truenon ha funzionato per me, questo ha funzionato :)
Stefan Monov

3
Funziona solo per applicazioni con finestra, l'applicazione console mostra ancora la finestra
geografica

18

Questo dovrebbe funzionare, prova;


Aggiungi un riferimento di sistema.

using System.Diagnostics;

Quindi usa questo codice per eseguire il tuo comando in una finestra CMD nascosta.

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

11

Questo non mostra la finestra:

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

...
cmd.Start();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.