WindowsForms / Applikation vorübergehend in die Taskleiste minimieren
-
Ich rufe in einer Form mit System.Diagnostics.Process.Start("...") eine Webseite auf.
Wie kann ich die Applikation beim Aufruf der Webseite in die Taskleiste setzen und
nach Schliessen der Webseite wieder anzeigen lassen?
-
So?
var p = new Process(); p.StartInfo = new ProcessStartInfo("iexplore.exe", "www.google.de"); p.EnableRaisingEvents = true; p.Exited += (sender_, e_) => { this.WindowState = FormWindowState.Normal; }; this.WindowState = FormWindowState.Minimized; p.Start();
-
Wenn du dir ein Process Objekt erstellst, kannst du mit WaitForExit() warten, bis es beendet wurde. Dann machst du es so:
// save state FormWindowState previousState = this.WindowState; // minimize this.WindowState = FormWindowState.Minimized Process myProcess = new Process(); try { myProcess.StartInfo.FileName = "http://some.domain.tld/bla"; myProcess.Start(); myProcess.WaitForExit(); } catch (Exception e) { Console.WriteLine(e.Message); } // restore this.WindowState = previousState
-
Danke soweit. Doch beide Vorschläge laufen nicht sauber. Derzeit verwende ich folgenden Code.
Nur, nach Schliessen der Webseite bleiben die Forms minimiert in der Taskleiste.
Ich möchte sie aber in den vorherigen Zustand zurückholen.Process p = new Process(); p.StartInfo = new ProcessStartInfo("http://xxxxx.xxx/xxxx"); this.WindowState = FormWindowState.Minimized; // aktuell aufrufende Form fm.WindowState = FormWindowState.Minimized; // Mainform p.Start();
-
bei mir würde das so nicht funktionieren, da bei mir der browser immer läuft und der code nur einen neuen Tab erstellen würde. ich glaube nicht dass beim Verlassen des Tabs WaitForExit triggert.
-
berniebutt schrieb:
Danke soweit. Doch beide Vorschläge laufen nicht sauber. Derzeit verwende ich folgenden Code.
Nur, nach Schliessen der Webseite bleiben die Forms minimiert in der Taskleiste.
Ich möchte sie aber in den vorherigen Zustand zurückholen.Process p = new Process(); p.StartInfo = new ProcessStartInfo("http://xxxxx.xxx/xxxx"); this.WindowState = FormWindowState.Minimized; // aktuell aufrufende Form fm.WindowState = FormWindowState.Minimized; // Mainform p.Start();
Keine Ahnung was der von dir gepostete Code zeigen soll, aber ich erwarte schon eine bessere Beschreibung als "beide Vorschläge laufen nicht sauber" von einem Mitglied, das weit über 2000 Beiträge hat und seit ~7 Jahren dabei ist
-
Ich denke das Grundproblem ist, daß die Windows Message Queue nicht abgearbeitet wird (so daß das Minimieren eben nur als Message in der Queue hängt).
Ein "Application.DoEvents()" sollte dann Abhilfe schaffen (auch wenn diese Methode eigentlich verpönt ist).
Daher finde ich auch, daß ein "myProcess.WaitForExit()" nichts in einem GUI-Programm zu suchen hat (da es eben den GUI-Thread blockiert), sondern man sollte stattdessen das Process.Exited-Ereignis abonnieren und die GUI dann weiterhin bedienbar halten (evtl. dann lieber "Enabled = false" o.ä. setzen, wenn der Anwender keine Aktionen in der Zeit tätigen darf).
Aber das Problem mit dem "als neuen Tab im Browser öffnen" löst das natürlich nicht...
-
Th69 schrieb:
Aber das Problem mit dem "als neuen Tab im Browser öffnen" löst das natürlich nicht...
Ich denke das zu lösen, ist auch auch ganz schön viel Stress. Vielleicht kommt man an die Handles der einzelnen Tabs ran und kann prüfen, ob sie noch gültig sind.. aber vielleicht auch nicht. Im Zweifel würde ich es lieber so angehen, dass jedes mal eine neue Instanz des Browsers gestartet wird und man gar nicht in Verlegenheit kommt, mehrere Tabs zu haben (außer der Benutzer macht weitere auf, aber das ist dann sein Problem).
Ansonsten bleibt immer noch die Möglichkeit, das WebBrowser-Control auf 'ne eigene Form zu knallen und es darüber abzuhandeln.
-
Ich möchte mich wieder mit zwischenzeitlichen Erfahrungen melden.
1. WaitForExit ist nicht geeignet
2. Das Problem mit einem neuem TAB tritt bei mir nicht auf
3. Minimieren wird besser durch Hide ersetzt
4. Falls noch eine andere Form (formOpen) geöffnet war, muss diese gesondert behandelt werdenSo läuft die Sache wie gewünscht ohne störende Effekte.
private void button1_Click(object sender, EventArgs e) { if(formOpen != null) formOpen.Hide(); // im Konstruktor übergeben this.Hide(); Process p = new Process(); try { p.StartInfo = new ProcessStartInfo("iexplore.exe","http://www.xxxx.xxx/xxxx"); p.EnableRaisingEvents = true; p.Exited += new EventHandler(pProcess_Exited); p.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void pProcess_Exited(object sender, System.EventArgs e) { this.Close(); if(formOpen != null) formOpen.Show(); }
-
Mach doch wenigstens eine finally-Klausel zum try-catch,Schreib noch Code in den catch-Block, in dem die Form wieder angezeigt wird, falls es beim Starten des Prozesses eine Exception gibtEdit: Schwachsinn beseitigt
-
Die finally-Klausel würde aber immer ausgeführt werden, wenn schon dann innerhalb des catch-Blocks
-
Da hast du natürlich Recht
Hab beim Antworten gepennt, aber meine Antwort eben noch korrigert. Danke für den Hinweis