Laden...

Process ohne Window starten

Erstellt von eigeneachse vor 17 Jahren Letzter Beitrag vor 17 Jahren 6.130 Views
E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren
Process ohne Window starten

Hallo zusammen,
ich möchte ein Programm schreiben, mit welchem ich beliebige Programme im Hintergrund starten kann.
Nur scheitere ich leider schon daran, dass ich es nicht hinbekomme, mir keine Fenster anzeigen zu lassen. Ich habe mal folgendes Probiert:


System.Diagnostics.Process myprocess = new System.Diagnostics.Process();
myprocess.StartInfo.FileName = "fuppes.exe";
myprocess.StartInfo.WorkingDirectory = @"C:\Programme\Free UPnP Entertainment Service\";
myprocess.StartInfo.CreateNoWindow = true;
//myprocess.StartInfo.Arguments= "-E" ;
myprocess.Start();

Leider bekomme ich auch mit CreateNoWindow = true immer ein Fenster zu sehen.
Könnt Ihr mir weiterhelfen?

Danke im vorraus für Eure bemühungen.

Gruß
eigeneachse

C
366 Beiträge seit 2005
vor 17 Jahren

Hi,

ich brauche genau das selbe und ich sollte der der gestarteten Anwendung (Commandozeile) auch noch Befehle übergeben können (also Simulation der man. Eingabe in der Kommandozeile).

mfg
Capt.Iglo

V
327 Beiträge seit 2005
vor 17 Jahren

@eigeneachse
für welchen Prozess soll den kein Fenster erscheinen, für das was gestartet wird oder welches die Programme startet?
und warum?
wenn es für dich ist, ist es doch nicht schlimm wenn da ein Fenster erscheint, oder?

@CaptainIglo


System.Diagnostics.Process myprocess = new System.Diagnostics.Process();
myprocess.StartInfo.Arguments= "";  //deine Argumente
myprocess.Start();

MFG Veasel

E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren

Hallo zusammen,
ich habe das Problem selber gelöst.
Vielleicht hilft es ja auch noch anderen.


System.Diagnostics.Process myprocess = new System.Diagnostics.Process();
myprocess.StartInfo.FileName = @"C:\Programme\Free UPnP Entertainment Service\fuppes.exe";
myprocess.StartInfo.CreateNoWindow = true;
myprocess.StartInfo.UseShellExecute = false;
myprocess.Start();

Es hat ein


myprocess.StartInfo.UseShellExecute = false;

gefehlt.
Nur muss man sich jetzt anschliessend noch selber um das beenden der gestarteten Prozesse kümmern.

Dieser Link hilft auch noch.
Mike Stalls .net Debugging

Gruß
eigeneachse

E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren

Original von veasel
@eigeneachse
für welchen Prozess soll den kein Fenster erscheinen, für das was gestartet wird oder welches die Programme startet?
und warum?
wenn es für dich ist, ist es doch nicht schlimm wenn da ein Fenster erscheint, oder?

Es ist für mich und es nervt mich furchtbar wenn cih 5 cmd Tasks in der Taskbar habe 😁

Danke für deine Hilfe

Gruß
eigeneachse

C
366 Beiträge seit 2005
vor 17 Jahren

Bei mir funktioniert das nicht. Es kommt trotzdem die Kommandozeile und die übergebenen Befehle funktionieren nicht.

Habe folgenden Code:

private void btnStream_Click(object sender, EventArgs e)
        {
            vlc.StartInfo.FileName = @"VLC\vlc.exe";
            vlc.StartInfo.Arguments = @"-vvv -I rc C:\robots.avi --sout #standard{access=mmsh,mux=asf,dst:localhost:8080}";
            vlc.StartInfo.CreateNoWindow = true;
            vlc.StartInfo.UseShellExecute = false;
            vlc.StartInfo.RedirectStandardInput = true;
            vlc.StartInfo.RedirectStandardOutput = true;
            vlc.Start();
        }

        private void buttonSeek_Click(object sender, EventArgs e)
        {
            vlc.StandardInput.WriteLine("seek 10");
        }
E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren

Hallo CaptainIglo,
probiere doch mal bei vlc.StartInfo.FileName den absoluten Pfad anzugeben.
Bei mir ging es auch nur so.

Gruß
eigeneachse

C
366 Beiträge seit 2005
vor 17 Jahren

Fenster bzw. die Kommandozeile kommt trotzdem...

E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren

Hallo CaptainIglo,
bei mir kommen auch Fenster wenn es sich um eine Anwendung handelt die sich nicht in der cmd abspielt.
Vielleicht braucht es doch noch eine andere Lösung.
Daher nochmal die Frage an alle. Kennt jemand noch einen anderen Weg?

Danke vielmals.

Gruß
eigeneachse

E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren

@CaptainIglo

Das hier sollte für Dich das richtige sein.

SW_HIDE

Gruß

eigeneachse

C
366 Beiträge seit 2005
vor 17 Jahren

Danke, funktioniert.

E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren

Eine Frage hätte cih noch.
Hast du es geschafft, dass das Programm nicht kurz aufflackert?

Gruß

eigeneachse

C
366 Beiträge seit 2005
vor 17 Jahren

Nein, das hab ich nicht, aber das ist bei mir nicht so tragisch, da es eine Serveranwendung ist, wo eigentlich selten jemand davor sitzt, wollte eben nur nicht mehrer Promt's offen haben.

Meine andere Frage bzgl. Eingabe habe ich übrigens in einen anderen Thread verfrachtet:
Gestartetem Prozess Tastatureingabe "simulieren"?

mfg
Capt.Iglo

E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren
Prozesse ohne Window - mal wieder -

Hallo Zusammen,
ich hatte schon einmal einen Thread aufgemacht, in dem es darum ging Prozesse im Hintergrund zu starten. Siehe Thread

Ich habe nun folgendes versucht.


Process proc = new Process();
proc.Exited 						+= new System.EventHandler(processExited);
proc.EnableRaisingEvents 			= true;
proc.StartInfo.FileName 			= aFilename;
proc.StartInfo.CreateNoWindow 		= true;
//proc.StartInfo.UseShellExecute = false;
proc.Start();
proc.WaitForInputIdle();
			
ProcessInfo procInfo 	= new ProcessInfo();
procInfo.mProcessId 	= proc.Id;
procInfo.mWindowHandle 	= proc.MainWindowHandle;
procInfo.mFilename 		= System.IO.Path.GetFileName(aFilename);

Wenn ich jetzt z.b. cmd.exe über diese Vorgehensweise starten will bekomme ich folgende Meldung.


Exception System.InvalidOperationException was thrown in debuggee:
Fehler bei WaitForInputIdle. Möglicherweise hat der Prozess keine grafische Schnittstelle.

Nun meine Frage. Was habe ich für Möglichkeiten um auch Dosboxen über diese Systematik zu steuern? Wie könnte ich alternativ an die Sache rangehen?

Eine weitere Frage. Wenn ich ein Programm über diese Methode starte, welches für den Start länger braucht, dann bekomme ich kein proc.MainWindowHandle von diesem geliefert. Ich habe versucht per proc.WaitForInputIdle(); auf das Programm zu warten, bis es gestartet ist, aber das hat leider auch nicht geholfen. Ohne MainWindowHandle habe ich leider keinen Zugriff auf das Programm. Habt Ihr hierfür Ideen?

Danke im voraus.

Ich freue mich über eure Rückmeldungen.

Gruß
eigeneachse.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo eigeneachse,

naja, weil die beiden Threads natlos anschließen, habe ich sie gleich mal zusammengefügt. 🙂

Also ich habe WaitForInputIdle noch nie benutzt. Vielleicht wäre ja WaitForExit was für dich. Am ehesten würde ich aber denken, dass man bei Consolenanwendungen gar nicht warten muss.

Ansonsten würde ich denken, dass MainWindowHandle für Consolen-Anwendungen eh nicht gesetzt wird oder dass man zumindest damit nichts anfangen kann.

Was habe ich für Möglichkeiten um auch Dosboxen über diese Systematik zu steuern

Bei Consolenanwendungen läuft die ganze Kommunikation über StandardIn/-Out und -Error und nicht über FensterHandle.

herbivore

E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren

Hallo herbivore,
ersteinmal Danke für die Antwort. Das mit dem Threadzusammenschliessen ist natürlich völlig ok und ich werde das nächste mal besser acht geben.

Gibt es denn keine Möglichkeit das Fenster der Dosbox zu kontrollieren?
Das mit Standard In/Out leuchtet mir schon ein.. aber rein Optisch stört mich das Fenster doch. Ich will doch nur die Sichtbarkeit im Griff haben verzweifel.
Vielleicht gibt es ja noch weitere Hints.

Vielen Dank bis hierhin.

Gruß
eigeneachse

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo eigeneachse,

die Sichtbarkeit kann man m.E. nur mit ProcessStartInfo.CreateNoWindow und ProcessStartInfo.WindowStyle steuern.

Evtl. macht es eine Unterschied, ob man meinkommando direkt oder über oder cmd /c meinkommando startet.

herbivore

E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren

Hallo Herbivore,
ich muss erstmal das riesen Brett von meinem Haupt nehmen. Ein

StartInfo.WindowStyle			= ProcessWindowStyle.Hidden;

versteckt das cmd wunderbar.
Vielen Dank für den Tip.

Gruß
eigeneachse

B
1.529 Beiträge seit 2006
vor 17 Jahren

WaitForExit funktioniert mit jedem Prozess, WaitForInputIdle nur mit Prozessen mit message queue (Nachrichtenwarteschlange) - also im allgemeinen Forms.

E
eigeneachse Themenstarter:in
40 Beiträge seit 2007
vor 17 Jahren

Hallo Borg,
danke für deine Antwort.
Kennst du noch einen Weg um auf einen Prozess zu warten bis er ein MainWindowHandle hat?

Gruß
eigeneachse

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo eigeneachse,

ein Fenster einer Anwendung wird ja dadurch zum Hauptfenster, dass man es Application.Run als Parameter mit gibt (und nicht dadurch, ob der Benutzer der Anwendung das Fenster als Hauptfenster ansieht). Mal abgesehen von irgendwelchen kranken Designs, sollte damit zum Zeitpunkt InputIdle (das ist ja der Zeitpunkt, zu dem für Application.Run zum ersten Mal keine Nachrichten mehr in der Queue sind), die Erzeugung des Window.Handles immer zuverlässig abgeschlossen sein.

Wenn es zu diesem Zeitpunkt kein Hauptfenster gibt, dann eher, weil die Anwendung gar kein Hauptfenster hat, weil das parameterlose Application.Run verwendet wird. Dann könnte man aber sowieso lange warten.

Siehe auch: Form- und Codehandling

herbivore