2016-04-25 12 views
0

Ich habeC# kann ich nicht CreateNoWindow zu arbeiten - nicht einmal das msdn.com Beispiel

https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.createnowindow(v=vs.110).aspx

hier sah Und ich verstehe, dass

A) Nicht jedes Programm respektiert CreateNoWindow Anfrage und

B) Es erfordert UseShellExecute = False (Standard ist wahr).

C) Es soll angeben, ob ein Fenster erstellt wird. (Es wird das Elternfenster niemals verstecken). Es wird davon gesprochen, ob ein Fenster für den Kindprozess erstellt wird. (msdn sagt 'neues Fenster')

D) CreateNoWindow ist standardmäßig auf false gesetzt.

Ich bin dies von cmd ausgeführt, obwohl das Klicken im dreidimensionalen Studio das gleiche Verhalten zeigt.

Ich setze CreateNoWindow auf false, also hätte ich gedacht, dass es ein neues Fenster für den Kindprozess erstellen würde.

Aber es tut es nicht.

Task-Manager zeigt die zweite Instanz von cmd.exe, aber es gibt immer noch das eine Fenster, wie Sie sehen können. Unten ist die Paste aus einem Fenster. Es hat die untergeordnete cmd.exe in das übergeordnete Fenster geladen (das Ein-cmd-Fenster)

Wenn ich CreateNoWindow auf True oder False festlegen, dann scheint es keinen Unterschied zu machen.

So bekomme ich eindeutig nicht das Beispiel an diesem msdn Link zu arbeiten.

C:\crp>type aaa.csc 
using System.Diagnostics; 

class blah{ 
    public static void Main(string[] args) { 
      Process p = new Process(); 
      ProcessStartInfo psi = new ProcessStartInfo(); 
      psi.UseShellExecute=false; 
      psi.FileName="cmd.exe"; 
      psi.CreateNoWindow=false; 
      p.StartInfo=psi; 
      p.Start(); 
    } 
} 
C:\crp>csc aaa.csc 
Microsoft (R) Visual C# Compiler version 4.0.30319.34209 
for Microsoft (R) .NET Framework 4.5 
Copyright (C) Microsoft Corporation. All rights reserved. 


C:\crp>aaa.exe 

C:\crp>Microsoft Windows [Version 6.1.7601] 
Copyright (c) 2009 Microsoft Corporation. All rights reserved. 

C:\crp> 

UPDATE

Es scheint, es funktioniert. Wenn Sie eine Eingabeaufforderung von cmd öffnen und die EXE ausführen, wird in einem Fall cmd.exe innerhalb des übergeordneten Elements gestartet. Im anderen Fall startet es eine cmd.exe ohne Fenster. Das Verhalten im Visual Studio scheint jedoch merkwürdig, siehe meinen Kommentar zu Ephraims Antwort. In dieser Frage habe ich es zwar nur in Visual Studio versucht, aber ich habe es nur mit dem Projekt versucht, das als Konsolenanwendung dient, und dort wird immer ein Cmd-Eingabeaufforderungsfenster erscheinen. Das Verhalten ist für eine Nicht-Konsolenanwendung, z.B. eine Winforms-Anwendung.

Antwort

0

Es meisten Sinn macht von einem cmd.exe zuerst versucht

dann von dort das Verhalten verstehen, wenn von Visual Studio

Das Wort neu in CreateNoNewWindow läuft, ist ein wenig irreführend. Es ist eher so, als ob es kein Fenster erstellt und sogar kein Fenster verwendet.

Wenn CreateNoNewWindow = false (Standard) ist, wird das untergeordnete cmd im übergeordneten Fenster ausgeführt. (Das mag seltsam erscheinen, aber wenn man es mit dem vergleicht, was passiert, wenn CreateNoNewWindow = true ist, ist es nicht so seltsam). Wenn Sie das Programm ausführen, sehen Sie, dass das cmd-Banner mit Copyright e.t.c angezeigt wird. Das ist von dem untergeordneten Cmd, das im übergeordneten Fenster ausgeführt wird.

Wenn CreateNoNewWindow = true ist und Sie Ihr Programm ausführen, wird nichts ausgegeben. Der Task-Manager zeigt weiterhin die zweite cmd.exe an, da die untergeordnete cmd.exe, aber nicht in einem beliebigen cmd-Fenster ausgeführt wird.

Jetzt für das Verhalten in Visual Studio.

Mit Visual Studio-Konsolenanwendungen, wenn Sie auf Abspielen klicken, wird Visual Studio sein cmd-Fenster öffnen, das verschwindet, sobald das Programm abgeschlossen ist, aber alle generierten Prozesse weiter bestehen. Wenn Sie CreateNoNewWindow auf true gesetzt haben (dh überhaupt kein Fenster verwenden), wird das cmd-Fenster geöffnet, der zweite cmd wird in keinem Fenster angezeigt, also unsichtbar, dann das übergeordnete cmd-Fenster wird geschlossen und das erzeugte Kind cmd.exe wird weiterhin im Task-Manager angezeigt, hat aber kein Fenster. Der Task-Manager zeigt also eine cmd.exe an, und Sie werden kein Fenster sehen.

Als Test vor dem Testen des folgenden Absatzes können Sie ein cmd-Fenster erstellen, sdfsdfds, so dass Sie etwas in der Befehlshistorie mit Pfeil nach oben haben, so dass Sie sehen können, ob Sie im Befehl parenet sind. Starten Sie dann einen Kindprozess. Geben Sie cmd<ENTER> ein. Jetzt töte den Elternteil. Das Kind ist immer noch da. Wenn Sie CreateNoNewWindow auf false gesetzt haben (dh das Elternfenster verwenden), ist dies (wie wir gesehen haben) möglich, selbst wenn ein Elternprozess abgebrochen wurde, wenn das Kind erstellt wurde und dieses verwendet.

Fenster, bevor der Elternteil getötet wurde), dann klick auf play, dann wird Visual Studio das cmd-Fenster aufklappen, und es wird ein Kind-cmd.exe-Prozess erzeugt und der Task-Manager zeigt nur einen cmd.exe-Prozess, aber in einem Fenster, und die Wiedergabetaste wird wieder als aktiv angezeigt, sodass das Programm die Ausführung abgeschlossen haben muss und der Elternprozess abgeschlossen wurde. Visual Studio hat also die übergeordnete Datei cmd.exe geschlossen, aber das untergeordnete Element ist immer noch vorhanden und verwendet das Fenster des übergeordneten Elements vor dem Erledigen der übergeordneten cmd.exe.

Das ist, wenn ein visuelles Studio-Projekt auf Konsolen-Anwendung festgelegt ist, wo eine Konsole immer mindestens hochschnellen wird.

Aber für ein Projekt, das nicht als eine Konsolenanwendung erstellt wird, z. Für eine Winforms-Anwendung kann die Konsole so eingestellt werden, dass sie ausgeblendet wird und keine Konsole hochfährt oder sogar für das Hauptprogramm ausgeführt werden muss.

Hinweis hier - UseShellExecute und CreateNoWindow werden auf ihre nicht standardmäßigen Werte gesetzt. UseShellExecute ist standardmäßig true und wir setzen es auf false, weil wenn UseShellExecute true ist, CreateNoWindow den Wert von sich selbst ignoriert (CreateNoWindow) und ein neues Fenster erstellt wird (auch wenn CreateNoWindow auf true gesetzt ist). CreateNoWindow ist standardmäßig false und wir setzen es auf true. Wenn Sie CreateNoWindow verwenden möchten, wäre UseShellExecute = false und CreateNoWindow = true der einzige nicht überflüssige und funktionierende Anwendungsfall. (Wenn UseShellExecute = true (Standard), dann sollten Sie Prozessfenster Stil versteckt verwenden ..) bedenken, auch diese Dinge für cmd.exe arbeiten, aber für einige andere Dinge wie calc.exe scheitern

ProcessStartInfo psi = new ProcessStartInfo(); 
psi.FileName = "cmd.exe"; 
psi.UseShellExecute = false; 
psi.CreateNoWindow = true; 
Process.Start(psi); 
1

die Sie interessieren Visual Studio und den Pull Dateipfad für das

public static void Main(string[] args) { 
    try 
    { 
     ProcessStartInfo psi = new ProcessStartInfo(); 
     psi.FileName = "C:\\Windows\\System32\\cmd.exe"; // full path 
     psi.CreateNoWindow = true; 
     psi.UseShellExecute = false; 
     Process childProcess = Process.Start(psi); // child process 
     // This code assumes the process you are starting will terminate itself. 
     // Given that is is started without a window so you cannot terminate it 
     // on the desktop, it must terminate itself or you can do it programmatically 
     // from this application using the Kill method. 
    } 
    catch(Exception ex) 
    { 
     Console.WriteLine(e.Message); 
    } 
} 
+0

dies scheint zu machen ein unterschied wenn man es aus visual studio macht, aber nicht von cmd .. was seltsam erscheint/In visual studio in einem settof von CreateNoWindow hält es das cmd Fenster geöffnet während es den Child Prozess ausführt. Im anderen Fall schließt es es.Ich sehe immer noch nicht, wie das mit der Bedeutung von CreateNoWindow zusammenhängt. – barlop

+0

Haben Sie das als Referenz gelesen? http://StackOverflow.com/a/5094208/6138713 –

+0

ja ich habe gelesen, dass – barlop

0

I UseShellExecute=True; gesetzt cmd.exe definieren .... und es scheint zu funktionieren.

Ungerade, ohne diese Zeile, müssen Sie zweimal eingeben, einmal um die untergeordnete cmd.exe (die das Fenster nicht wirklich schließt) zu schließen, und einmal, um die übergeordnete cmd.exe zu schließen.

+0

Wenn Sie sagen, dass es funktioniert, wie nennt man das? Und wenn du diese Linie hast. Macht CreateNoWindow dann einen Unterschied? Ich denke, dass Sie mit UseShellExecute finden werden, dann wird CreateNoWindow ignoriert .. wie der msdn Link sagt. Und damit wird es nicht funktionieren. – barlop

+0

Ohne dass UseShellExecute true, d. H. Mit false, scheint es kein neues cmd-Fenster zu erstellen, unabhängig von CreateNoWindow (auch wenn CreateNoWindow auf false gesetzt ist), und das ist das Problem. Wie auch immer, es ist normal, in einer Situation von cmd, die innerhalb desselben cmd-Fensters ausgeführt wird, zweimal exit einzugeben. Versuchen Sie, ein cmd-Fenster zu öffnen und tippen Sie dann cmd '' cmd 'Sie sehen, es öffnet cmd innerhalb von cmd, wenn Sie den Pfeil nach oben drücken, sehen Sie keine Befehlsgeschichte, da es eine neue Instanz ist, und Sie müssen Geben Sie exit mehrmals ein, um das ursprüngliche cmd-Fenster zu schließen. – barlop

+0

"Wenn Sie sagen, dass es funktioniert, wie nennt man Arbeiten?" Es hat ein zweites cmd.exe-Fenster erstellt ... wie erwartet. Jemand hat eine schlechte Entscheidung getroffen, als er eine Eigenschaft 'CreateNoWindow' genannt hat. Es verursacht eklige Doppel-Negative. 'CreateNoWindow = false' wäre besser als' CreateWindow = true' –