Konsolenfenster vor Process.Start C # ausblenden


102

Ich versuche, einen Prozess auf einem Remotecomputer mithilfe der System.Diagnostics.Process-Klasse zu erstellen. Ich kann einen Prozess erstellen. Das Problem ist jedoch, dass das Erstellen eines Dienstes lange dauert und das Konsolenfenster angezeigt wird. Eine andere ärgerliche Sache ist, dass das Konsolenfenster über meinem Windows-Formular angezeigt wird und ich keine anderen Operationen in diesem Formular ausführen kann. Ich habe alle Eigenschaften wie eingestellt CreateNoWindow = true,

proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden

Trotzdem wird das Konsolenfenster angezeigt. Sogar ich habe Ausgabe und Fehler umgeleitet, um den Stream zu trennen, aber kein Glück.

Gibt es eine andere Möglichkeit, das Konsolenfenster auszublenden? Bitte hilf mir .

Hier ist der Teil meines Codes, mit dem ich den Befehl sc ausgeführt habe.

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();

Haben Sie versucht einzustellen proc.StartInfo.RedirectedStandardOutput = true? Ich habe dies mit einer Windows-Anwendung zum Laufen gebracht.
Poy

Gibt es eine endgültige Lösung mit einem vollständigen Quellcodebeispiel?
Kiquenet

In einer Windows- Konsolen- App hat das einfache Festlegen von UseShellExecute - ohne Umleitung oder irgendetwas anderes - für mich funktioniert. Siehe hier .
Paul

Soweit das Konsolenfenster das Formular öffnet und sperrt, sollten Sie den Prozess als Task oder in einem neuen Thread ausführen
Ryan Dooley

Warum setzen Sie UseShellExecuteund CreateNoWindowzweimal?
Mike Lowery

Antworten:


119

Ich hatte ein ähnliches Problem beim Versuch, einen Prozess zu starten, ohne das Konsolenfenster anzuzeigen. Ich habe mit verschiedenen Kombinationen von Eigenschaftswerten getestet, bis ich eine gefunden habe, die das gewünschte Verhalten aufweist.

Auf dieser Seite wird detailliert beschrieben, warum die UseShellExecuteEigenschaft auf false gesetzt werden muss.
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow.aspx

Unter Bemerkungen auf Seite:

Wenn die UseShellExecute-Eigenschaft true ist oder die Eigenschaften UserName und Password nicht null sind, wird der Wert der Eigenschaft CreateNoWindow ignoriert und ein neues Fenster erstellt.

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
Möchten Sie weitere Details hinzufügen? Das Warum funktioniert eher als das Wie .
Aqua

2
Liegt es daran, dass die Standardausgabe das Vorhandensein des Fensters erzwingt?
Denise Skidmore

1
Und anscheinend können Sie Standardausgabe nicht ohne Einstellung umleitenstartInfo.UseShellExecute = false;
Denise Skidmore

1
Ich bin gespannt, warum sie in dieser anderen Antwort UseShellExecute = true verwendet haben. stackoverflow.com/questions/2317767/c-process-start-hide
Denise Skidmore

9
Ich werde nie verstehen, warum Leute eine Ausnahme machen, die sie sowieso nur noch einmal werfen.
Blindy

54

Ich hatte Pech mit dieser Antwort, da der Prozess (Wix light.exe) im Wesentlichen zum Mittagessen ausgeht und nicht rechtzeitig zum Abendessen nach Hause kommt. Folgendes hat für mich jedoch gut funktioniert:

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

2
Arbeitete für mich - nett und einfach!
J c

2
Dies sollte wirklich die akzeptierte Antwort sein. Klappt wunderbar.
Eternal21

2
CreateNoWindow = truehat bei mir nicht funktioniert, das hat :)
Stefan Monov

3
Es funktioniert nur für Anwendungen mit Fenster, Konsolenanwendung zeigt immer noch Fenster
Geograph

18

Dies sollte funktionieren, versuchen Sie es;


Fügen Sie eine Systemreferenz hinzu.

using System.Diagnostics;

Verwenden Sie dann diesen Code, um Ihren Befehl in einem ausgeblendeten CMD-Fenster auszuführen.

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

11

Das Fenster wird nicht angezeigt:

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

...
cmd.Start();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.