C++ Fenster im Vordergrund wechseln

Hi @all!

Ich habe ein kleines Problem: Ich habe zwei Programme (A und B), beide in c++ geschrieben. Programm A darf nicht modifiziert werden. Die Lösung des Problems muss unabhängig vom Aufruf beider Programme sein (also Programm A aus B aufrufen geht nicht) und es darf keine Rolle spielen, ob noch andere Programme zusätzlich geöffnet sind oder wo sich die Fenster auf dem Bildschirm befinden.

Ich möchte jetzt, dass, wenn eine bestimmte Routine von B durchgelaufen ist, automatisch auf das (im Hintergrund schon geöffnete) Fenster von B gewechselt wird. Der Balken oben am Fensterrand soll halt blau werden und das Fenster somit aktiv im Vordergrund stehen.

Es gibt ja die Funktion SetForegroundWindow(). Diese benötigt aber den process identifier um das „richtige“ Fenster zu wählen. Wie bekomme ich den? So wie ich das verstanden habe wird die ID erst bei Aufruf vergeben - ist also jedes mal anders?

Oder anders gefragt: Wie gehe ich mit der Funktion GetProcessID() um? Die könnte mir ja die ID beschaffen. Allerdings muss ich ja da auch wieder irgendwie mein Fenster definieren…

Hallo Jens !

(Ich nehme an du redest von Windows als Betriebssystem.)
Du köntest das Handle des gesuchten Fensters ja über dessen Titel suchen, der Fenstertitel ist ja meist bekannt.
Das würde etwa so aussehen:

#include "windows.h"

bool Wait4OpenedWindow(char \*p\_sCaption, HWND \*p\_xWinHandle:wink:
{
 bool bFound;
 HWND xWinHandle;
 char sBuffer[1024];
 bool bRetVal;

 bRetVal = true;

 bFound = FALSE;
 do
 {
 xWinHandle = GetTopWindow(NULL);
 do
 {
 GetWindowText(xWinHandle, sBuffer, 1024);
 if (strcmp(sBuffer, p\_sCaption) == 0)
 {
 cwbuffer\_StrCpy(&m\_xWinCaption, sBuffer);
 \*p\_xWinHandle = xWinHandle;
 bFound = true;
 break;
 }
 }
 while ((xWinHandle = GetNextWindow(xWinHandle, GW\_HWNDNEXT)) != NULL);
 Sleep(100);
 }
 while (!bFound);

 return bRetVal;
}

mfg
Christof

Hallo Jens

Ich habe das in meiner Tipps-Datei so drin:

// Fenster aktivieren:
 HWND handle; 
 handle = FindWindow(NULL,"Fenstername"); 
 if(handle){SetForegroundWindow(handle);}

// oder so:
 ShellExecute(0,NULL,"C:\\windows\\system32\\notepad.exe",
 NULL,NULL,SW\_SHOWMAXIMIZED);
 HWND edit = FindWindow(NULL, "Unbenannt - Editor");
 SetForegroundWindow(edit);

Habe ich aber noch nicht viel ausprobiert.

lG
Martin B

hey, danke! der erste tipp mit dem findwindow macht genau das, was ich brauchte. und es ist ja viel simpler als mit der id… Danke!