Fenster vor Anwendung im Vollbild
-
Hallo,
Folgendes problem:
Ich starte von meiner eigenen Anwendung aus per createProcess() eine andere,
beispielsweise ein Spiel(Counter strike, Quake o.ä.)
Dieses startet dann im Vollbildmodus. Meine Anwendung bleibt aber im Hintergrund aktiv.Wenn in meiner Anwendung ein ganz bestimmtes Ereignis auftritt, möchte ich dem Benutzer eine MessageBox anzeigen. Diese soll als modales Fenster vor dem
Spiel im Vollbildmodus stehen.bzw. das Spiel minimieren und erst nach Quittieren der MessageBox wieder maximieren.Mit FindWindow() kanmn ich nicht arbeiten, da ich den Fenstertitel des Spiels nicht unbedingt kenne.
Kann mir Jemand einen Tip geben, wie das zu bewerkstelligen wäre?
Für jegliche Hilfe, Danke im Voraus
-
Besorg dir den Fenstertitel mittels Winsight (Borland) oder Spy++ (MS).
Auf jeden Fall ist das alles reine WinAPI, dorthin verschoben.
-
Vom Starten kannst du ja die Process-ID bekommen - dann alle Fenster durchgehen und mit dieser vergleichen.
Oder evtl. auch über WindowFromPoint
-
Du bekommst von CreateProcess eine ProcessID und auch eine ThreadId. Das ist der GUI-Thread des Prozesses...
Dann steppst Du mit EnumWindows durch alle Fenster durch und vergleichst in der EnumWindowsProc den übergebenen HWND mit dem HWND deines gestarteten Prozesses (z. B. mit GetWindowThreadProcessId).
Ist das, was GetWindowThreadProcessId zurückliefert == die ThreadId, dann hast Du den HWND für Deinen gestarteten Prozess...
Und damit kannste dann (in der EnumWindowsProc) weiter arbeiten. Sobald Du fertig mit dem HWND bist kannst Du das Fenster abklappern mit return FALSE beenden...
-
Danke für die Antworten, werds mal testen.
PS: Jansen, wird schwierig, den Benutzer aufzufordern, Winsight zu starten., sich den Fenstertitel zu holen und in ein Editfeld einzutragen, damit das Programm den Fenstertitel bekommt...:)
-
Hab mich jetzt erstmal nicht durch den ganzen EnumWindows Kram gewühlt,
sondern es so gemacht:ShowWindow(GetForegroundWindow(),SW_MINIMIZE);
MessageBox(blabla);Das funktioniert auch ganz gut.
Ich müsste das Fenster jetzt nur wieder maximieren können.Gibt es sowas wie einen Variable, die das Fensterhandle aufnehmen kann?
Handle *Hwnd; oder so ähnlich?
-
Versuch's mal so:
HWND hFgWnd = GetForegroundWindow(); ShowWindow(hFgWnd,SW_MINIMIZE); MessageBox(blabla); ShowWindow(hFgWnd,SW_RESTORE);
-
Jawoll, danke Flenders.
Funktioniert zwar noch nicht zu 100% weil die Bildschirmauflösung der externen Anwendung nicht wieder hergestellt wird, aber es ist ja kein Problem, die vorher abzufragen und wieder neu setzen.
Gruss Harald