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.