W
Die Message heißt WM_MDIACTIVATE. Allerdings bekommt das Hauptfenster sie nicht zu sehen; sie sollte also in der MDIChildProc verarbeitet werden.
Die Nachricht wird sowohl vom aktivierten als auch vom de-aktivierten MDI-Child-Fenster empfangen. In beiden Fällen steht in lParam der Handle zum aktivierten, in wParam zum de-aktivierten Fenster. In der MDIChildProc kann man also mit 'if(lParam==hWnd)' überprüfen, ob man sich gerade im aktivierten oder im de-aktivierten Fenster "befindet".
Ich würde die Programmlogik so aufbauen, dass die Reihenfolge, in der die beiden Childfenster WM_MDIACTIVATE empfangen, keine Rolle spielt. Z.B. indem man alle Aktionen dann durchführt, wenn gerade das aktivierte Fenster die Nachricht verarbeitet (also wenn lParam==hWnd). Wie gesagt, mit wParam hat man ja auch dann Zugriff auf das soeben de-aktivierte Fenster. Das sollte problemlos sein, wenn man Aktionen beim Schließen eines Child-Fensters in WM_CLOSE oder WM_DESTROY statt in WM_MDIACTIVATE durchführt.
Wie Martin R. schrieb, macht es Sinn, eine eigene Verwaltung aufzubauen.
Man könnte z.B. eine Struktur/Klasse 'MDI_KID' definieren, eine Instanz davon für jedes neu erstellte MDI-Child allozieren, und per SetWindowLongPtr() mit dem Childfenster assoziieren. In diese Stuktur kann man alle Daten packen, die man für das jeweilige Child (einschließlich dessen HWND, siehe unten) braucht.
Das macht sich wahrscheinlich spätestens dann bezahlt, wenn man komplexere Features für die MDI-Children implementieren möchte, z.B. eine Tab-Leiste (dann könnte man jeden Tab mit einem Pointer auf die jeweilige MDI_KID-Struktur versehen, und so den Tab mit einem Childfenster verknüpfen, einschließlich dessen HWND), oder eine Seitenleiste, die Daten des aktiven Fensters anzeigen soll...
Wenn man die 'MDI_KID'-Instanzen zu einer Liste verkettet, kann man schön durch sämtliche vorhandenen MDI-Children navigieren. Wenn sowohl der Rückwärts- als auch der Vorwärts-Listenpointer des gerade aktiven MDI_KIDs NULL sind, weiß man, dass nur ein MDIChild existiert, usw.
Walter Z