Handle des MainWindow eines Prozesses ermitteln
-
Hallo Allerseits!
Folgendes:
Ich starte in meinem Programm mit CreateProcess() eine Exe und merke mir die dazugehörigen TProcessInformation und TStartupInfo in den entsprechenden Variablen. Jetzt ist es so, dass ich aus einem Menü, in dem die gestarteten Exen gelistet sind, die gestartete Exe wieder in den Vordergrund bringen will.
Also, ich habe eine ProzessId einer Exe und möchte dazu das gehörende MainWindow maximieren bzw. wieder in den Vordergrund bringen.
Wie stelle ich das am Besten an?
F98
-
Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Mit EnumWindows alle Fenster durchgehen und dir dann jeweils mit GetWindowThreadProcessId dessen Process-ID holen und mit deiner Vergleichen.
Siehe auch: http://www.c-plusplus.net/forum/viewtopic.php?t=83314
-
Jo, danke.
-
So, mein Code sieht jetzt so aus und funktioniert ... nicht

HWND hwndFromCallBack; BOOL CALLBACK EnumWindowsProc2(HWND hwnd, LPARAM lParam) { static DWORD dwID; static HWND hwnd_Owner; GetWindowThreadProcessId(hwnd, &dwID); if (dwID == (DWORD)lParam) { hwnd_Owner = GetWindow(hwnd, GW_OWNER); if (hwnd_Owner) { hwndFromCallBack = hwnd_Owner; return false; } } return true; } ... if (TempJob) { // ProzessID ermitteln und an die Callback Fkt. übergeben EnumWindows((WNDENUMPROC)EnumWindowsProc2, DBAccess->GetJobExeProcId(TempJob->iId)); HandleWindow = hwndFromCallBack; if (HandleWindow != NULL) { // in den Vordergrund holen ShowWindow(HandleWindow, SW_SHOWNORMAL); BringWindowToTop(HandleWindow); //SendMessage(HandleWindow, WM_SHOWWINDOW, true, 0); } else { //Starten } } ...Ich starte aus dem Code heraus mit CreateProcess() z.B. calc.exe (ProzessId == 292). Die ProzessID ist korrekt (Taskmanager), nur stimmt in der Callback Funktion 2x "dwID == (DWORD)lParam" überein. GetWindow(hwnd, GW_OWNER) liefert dann 2x "NULL" zurück, also ist hwndFromCallBack ebenfalls NULL.
Letztendlich findet die Funktion nicht das passende Fenster zum Prozess. Was mach ich falsch?
-
GetWindow liefert dir NULL zurück, wenn das angegebene Fenster kein Ownerfenster hat. Ich glaub mit GetAncestor(hwnd, GA_ROOTOWNER); gehts. Wenn der Prozess nur ein TopLevel Fenster hat, brauchst du die Funktion gar nicht aufzurufen.
Das static kannst du wegmachen.
-
Ok, ich hatte schon sowas vermutet. Meine Lösung sieht jetzt wie folgt aus (funktioniert):
BOOL CALLBACK EnumWindowsProc2(HWND hwnd, LPARAM lParam) { WINDOWPLACEMENT wp; char Caption[255]; hwndFromCallBack = 0; if (!GetWindow(hwnd, GW_OWNER) && IsWindowVisible(hwnd)) { GetWindowText(hwnd, Caption, 255); GetWindowPlacement(hwnd, &wp); if (wp.showCmd != SW_HIDE && strcmp("", Caption) != 0) { DWORD dwID; GetWindowThreadProcessId(hwnd, &dwID); if (dwID == (DWORD)lParam) { hwndFromCallBack=hwnd; return false; } } } return true; }Danke an alle für die Hilfe!

-
du kannst die Funktion schneller machen indem du nicht zwei mal prüfst, ob das Fenster sichtbar ist (IsWindowVisible langt) und indem du GetWindowTextLength verwendest um zu prüfen, ob das Fenster ienen Titel hat.