Mit einem C# Konsole Programm abwechselnd zwei Browser in den Vordergrund holen.
-
Mir ist gerade aufgefallen, dass beide Browser noch laufen und dennoch kommt die Meldung:
"System.InvalidOperationException: Die angeforderten Informationen sind nicht verfügbar, da der Prozess beendet wurde."
Immerhin bin ich der Meinung, dass ich mir mit das Handle auf das Hauptfenster hole mit
IntPtr opera_hWnd = opera_process.MainWindowHandle;
Warum quakt dann der Compiler der Prozess(das Hauptfenster) sei beendet worden, wenn es doch ganz klar zu sehen ist?
-
weißt du eigentlich, was prozesse, mainwindows und nicht-mainwindows (aka childwindows) sind?
-
Wieso die Frage, wenn ich ein Handle aufs Hauptfenster bekomme, erwarte ich, dass es solange gültig ist, wie das Fenster sichtbar ist. Bzw. solange der Browser läuft. Bzw. solange der Browser läuft.
-
Mit Swordfischs Vorschlag bekomme ich 9 Chrome-Prozesse, obwohl ich Chrome nur einmal starte. verdammte Frickelei
Wie bekomme ich nun heraus, welches das "geeignete Fenster" ist? Ich möchte doch bloß den Browser in den Vordergrund holen.
-
Einfach für alle 9 Prozesse SetForegroundWindow aufrufen? xD
-
while(true) { Process[] processName = Process.GetProcessesByName("chrome"); if (processName.Length != 0) { foreach(Process proc in processName) { Console.WriteLine(proc.ProcessName); Stuff.SetForegroundWindow(proc.MainWindowHandle); } chrome_process.WaitForInputIdle(); } Thread.Sleep(3000); processName = Process.GetProcessesByName("opera"); if (processName.Length != 0) { foreach (Process proc in processName) { Console.WriteLine(proc.ProcessName); Stuff.SetForegroundWindow(proc.MainWindowHandle); } opera_process.WaitForInputIdle(); } Thread.Sleep(3000); }
Das gibt dieselbe Meldung. schnief
-
@bruder sagte in Mit einem C# Konsole Programm abwechselnd zwei Browser in den Vordergrund holen.:
Wieso die Frage, wenn ich ein Handle aufs Hauptfenster bekomme, erwarte ich, dass es solange gültig ist, wie das Fenster sichtbar ist. Bzw. solange der Browser läuft. Bzw. solange der Browser läuft.
naja wenn du die frage mit "ja, ja und ja" beantworten könntest, würde deine erwartung vielleicht anders aussehen.
@bruder sagte in Mit einem C# Konsole Programm abwechselnd zwei Browser in den Vordergrund holen.:
Mit Swordfischs Vorschlag bekomme ich 9 Chrome-Prozesse, obwohl ich Chrome nur einmal starte. verdammte Frickelei
Wie bekomme ich nun heraus, welches das "geeignete Fenster" ist? Ich möchte doch bloß den Browser in den Vordergrund holen.vermutung: alle anderen 8 prozesse haben kein fenster, und deshalb schlägt SetForegroundWindow fehl bzw. wirft die ausnahme.
aber wie gesagt: ich weiß auch nicht, was die sich dabei gedacht haben, so viele prozesse zu starten. irgendwer hat das halt mal entschieden und alle anderen haben abgenickt.@bruder sagte in Mit einem C# Konsole Programm abwechselnd zwei Browser in den Vordergrund holen.:
Das gibt dieselbe Meldung. schnief
weißt du eigentlich, was eine ausnahme bzw. exception ist?
-
Astatt meine mageren Kenntnisse mit Fragen bloßszustellen könntest du mir ja lieber verraten, wie ich das zum Laufen bekomme
Okay ich versuche mal was mit try/catch
-
Ich nehme an, Ausnahmen bestätigen die Regel oder wie war das.
Okay die Exceptions dienen als eine quasi Sicherheitsmaßnahme dazu, um das Programm/Betriebssystem vor Crahs zu schützen. vermut
-
Der Grund ist ganz einfach: wenn ein Tab abstürzt (=> Prozess wird gekillt), sind nicht gleich alle anderen Tabs auch weg.
Es sollte trotzdem immer einen Hauptprozess (mit dem Hauptfenster) geben.Zumindestens beim Firefox gibt es nur ein Hauptfenster und die anderen Prozesse (welche per "-contentproc" gestartet werden) haben kein Fenster - sieht man gut mit dem Process Explorer).
-
@bruder sagte in Mit einem C# Konsole Programm abwechselnd zwei Browser in den Vordergrund holen.:
Astatt meine mageren Kenntnisse mit Fragen bloßszustellen könntest du mir ja lieber verraten, wie ich das zum Laufen bekomme
du könntest ja auch versuchen, dir das zur beantwortung dieser fragen notwendige wissen anzueignen (viel wissen ist immer gut) und dann würdest du ja auch wissen, dass prozesse voneinander unabhängige programme sind und daher nichts mit dem hauptfenster vom firefox zu tun haben müssen.
Okay ich versuche mal was mit try/catch
du könntest ja auch mal im debugger gucken, ob der handle einen gültigen wert (ich glaube irgendwas größer 0) besitzt bzw. inwiefern sich die handles voneinander unterscheiden.
-
Ich habe nu den Code unten probiert, es lief ca. 1 Minute ohne Absturz, das ist doch schon mal etwas. Könnte mir vll. jemand mal sagen, wie ich das verbessern könnte? Diese foreach Schleifen finde ich nicht dolle, kommt mir schon fast wie eine Brute-Force-Methode vor um ein Fensterchen in den Vordergrund zu bekommen. Und die leeren Catch-Blöcke gefallen mir auch nicht oder kann man den Code so lassen?
Process chrome_process; Process opera_process; try { chrome_process = Process.Start("chrome.exe"); opera_process = Process.Start("opera.exe"); chrome_process.WaitForInputIdle(); opera_process.WaitForInputIdle(); } catch (Exception e) { } Thread.Sleep(3000); while(true) { Process[] processName = Process.GetProcessesByName("chrome"); if (processName.Length != 0) { foreach (Process proc in processName) { try { Console.WriteLine(proc.ProcessName); Stuff.SetForegroundWindow(proc.MainWindowHandle); } catch (Exception e) { } } } Thread.Sleep(3000); processName = Process.GetProcessesByName("opera"); if (processName.Length != 0) { foreach (Process proc in processName) { try { Console.WriteLine(proc.ProcessName); Stuff.SetForegroundWindow(proc.MainWindowHandle); } catch(Exception e){} } } Thread.Sleep(3000); }
-
@Wade1234 "dann würdest du ja auch wissen, dass prozesse voneinander unabhängige programme sind und daher nichts mit dem hauptfenster vom firefox zu tun haben müssen."
Ja, das wusste ich aber dann sollen die Browser-Entwickler doch bitte die Prozesse anders benennen, die nix mit dem Hauptfenster zu tun haben.
-
@bruder hast du dir die werte der handles angesehen? evtl. ist das irgendwie -1 oder null oder sonstwas ungültiges. damit könntest du die dann auch herausfiltern.
-
@Wade1234 Ah, okay, ja, das werde ich mal tun.
-
BTW: Weisst du das Windows einen "Fokus-Klau-Schutz" eingebaut hat (google "focus stealing")? Probier mal was dein Code macht wenn du, bevor eines der beiden Fenster in den Vordergrund geholt werden soll, in ein anderes Fenster reinklickst.
-
@Wade1234 Die meisten Handles haben den Wert 0. Ich habe jetzt das in die try-Blöcke eingebaut, um unnötige Aufrufe von SetForegroundWindow zu vermeiden.
if (IntPtr.Zero != proc.MainWindowHandle) { Stuff.SetForegroundWindow(proc.MainWindowHandle); }
@hustbaer davon habe ich schon mal am Rande gelesen. Das macht aber nichts, während das Programm läuft, arbeitet niemand am PC. Ich habe in jedem Browser ein Spiel laufen und das Programm soll die Spiele neu starten, wenn sie beendet wurden, eine Art Autoplay-Programm soll das mal werden.
-
@bruder sagte in Mit einem C# Konsole Programm abwechselnd zwei Browser in den Vordergrund holen.:
Ich habe in jedem Browser ein Spiel laufen und das Programm soll die Spiele neu starten, wenn sie beendet wurden
Dann kennst Du doch bestimmt die Titel der Fenster.
FindWindow()
ftw.
-
Das klingt mir jetzt eher nach einem Fall für etwas wie CEF (ChromiumEmbeddedFramework). Gibt auch nen schönen .NET Wrapper dafür: https://cefsharp.github.io/
-
@Swordfish sagte in Mit einem C# Konsole Programm abwechselnd zwei Browser in den Vordergrund holen.:
@bruder sagte in Mit einem C# Konsole Programm abwechselnd zwei Browser in den Vordergrund holen.:
Ich habe in jedem Browser ein Spiel laufen und das Programm soll die Spiele neu starten, wenn sie beendet wurden
Dann kennst Du doch bestimmt die Titel der Fenster.
FindWindow()
ftw.Das ist ein nsfw Spiel das keinen Titel setzt.