C# MessageBox von Prozess mit MainWindowHandle = 0 in den Vordergrund bringen

palaber

Captain
Registriert
Juni 2006
Beiträge
3.856
Hi Leute,

ich versuche eine Messagebox in den Vordergrund meiner Applikation zu bringen. Die Messagebox wird von
einem Prozess geöffnet (exe die ich über Process.Start(ProcessStartInfoObjekt) starte).

Der normale Prozessstart öffnet das verwendete Tool im Vordergrund. Auch wenn das Tool von meinem ursprünglichen Programm
überdeckt ist, kann ich via Button-Klick das Tool wieder in den Vordergrund holen.
Dies realisiere ich über die Windows-APIs:
C#:
[DllImport("user32.dll")]
internal static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll")]
internal static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
Die variable hWnd entspricht hierbei der Prozess.MainWindowHandle Property.

Geht beim starten des Tools etwas schief erscheint eine MessageBox. Eigentlich im Vordergrund. Allerdings kann diese durch "blödes" klicken hinter die ursprüngliche Applikation rutschen. Jetzt funktioniert mein Button mit der SetForegroundWindow-Funktionalität leider nicht mehr. Das Problem ist, dass der Prozess den MainWindowHandle = 0 hat (somit kein aktives Fenster besitzt und nicht in der Taskleiste angezeigt wird).
Über ALT-TAB kann ich zwar die Fehlermeldung in den Vordergrund holen, dass ganze soll aber auch ohne Tastatur gehen.

Weiß jemand wie ich die Msg-Box "TopMost" bekomme?
Wird ein Process.Kill() durchgeführt wird auch die Msg-Box geschlossen (nur zur Info).

Danke für die Hilfe!
 
100% Verstanden hab ich das auch nicht, aber versuch doch mal
C#:
MessageBox.Show(new Form { TopMost = true }, "Hello, I'm on top!");

Alternativ, wenn du eh schon direkt mit der Windows API rumhantierst: Nutz doch die MessageBox aus der user32.dll
 
Müsstest du nicht das Anwendungsfenster nach vorne holen, damit die MessageBox top most geht?

greetz
hroessler
 
Hi Leute,

danke für die Hilfe. Ich hab Aufgrund dessen mich dafür entschieden wie folgt vorzugehen:

Zunächste ermittel ich für jedes Fenstern die hWnd:
C#:
[DllImport("user32.dll", EntryPoint = "EnumDesktopWindows", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool EnumDesktopWindows(IntPtr hDesktop, EnumDelegate lpEnumCallbackFunction, IntPtr lParam);

Dann ermittel ich für die hWnd den Fenstertitel:
C#:
[DllImport("user32.dll", EntryPoint = "GetWindowText", ExactSpelling = false, CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpWindowText, int nMaxCount);

Wenn der Fenstertitel einen von mir definierten Suchstring enthält, habe ich somit den entsprechenden hWnd und kann das Fenster in den Vordergrund bringen.

Folgender Thread hat mir dabei gut geholfen:
https://social.msdn.microsoft.com/F.../get-list-of-open-windows?forum=csharpgeneral
 
Zurück
Oben