Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Utilisation de WM_MDIGETACTIVE

4 réponses
Avatar
Laura Martignas
Bonjour,

Je suis en train de réaliser un programme de capture de fenêtres. J'arrive
à capturer des fenêtres "normales" via un GetForegroundWindow() et un
BitBlt() adapté, mais je ne parviens pas à capturer des fenêtres faisant
partie d'une application MDI.

J'ai bien trouvé le message WM_MDIGETACTIVE, mais je ne vois vraiment pas
comment l'utiliser dans le cadre de mon application, vu qu'il a besoin du
hWnd de la fenêtre client, que je ne vois pas comment récupérer.

Auriez vous une idée ou un bout de code pour m'aiguiller ?

Merci par avance
Laura

4 réponses

Avatar
Christian ASTOR
Laura Martignas a écrit:


J'ai bien trouvé le message WM_MDIGETACTIVE, mais je ne vois vraiment pas
comment l'utiliser dans le cadre de mon application, vu qu'il a besoin du
hWnd de la fenêtre client, que je ne vois pas comment récupérer.

Auriez vous une idée ou un bout de code pour m'aiguiller ?



Comme dit l'aide... "to a multiple-document interface (MDI) client window"
=>
HWND hWndClient = FindWindowEx(hWnd, NULL, "MDIClient", NULL);
Avatar
Laura Martignas
Christian ASTOR a écrit :

Comme dit l'aide... "to a multiple-document interface (MDI) client
window" =>
HWND hWndClient = FindWindowEx(hWnd, NULL, "MDIClient", NULL);



Ok, donc si je veux par exemple récupérer la fenêtre MDI active d'une
application MDI, je dois d'abord récupérer le hWnd de l'application MDI via
GetForegroundWindow() (en supposant que cette application soit active),
puis passer ce handle à FindWindowEx() pour récupérer le hWnd client, et
enfin passer ce hWnd client comme paramètre de WM_MDIGETACTIVE pour obtenir
la fenêtre enfant active, c'est bien ça ?

Merci de ton aide
Laura
Avatar
Christian ASTOR
Laura Martignas a écrit:

Ok, donc si je veux par exemple récupérer la fenêtre MDI active d'une
application MDI, je dois d'abord récupérer le hWnd de l'application MDI via
GetForegroundWindow() (en supposant que cette application soit active),
puis passer ce handle à FindWindowEx() pour récupérer le hWnd client, et
enfin passer ce hWnd client comme paramètre de WM_MDIGETACTIVE pour obtenir
la fenêtre enfant active, c'est bien ça ?



Oui, tout-à-fait.
Pour tester, il suffit d'utiliser un timer (5 sec par ex), puis ds le
WM_TIMER =>
{
char sText[256];
HWND hWndMDI = GetForegroundWindow();
HWND hWndClient = FindWindowEx(hWndMDI, NULL, "MDIClient", NULL);
HWND hWndActive = (HWND)SendMessage(hWndClient, WM_MDIGETACTIVE, 0, NULL);
wsprintf(sText, "hWnd = %x", hWndActive);
MessageBox(NULL, sText, "Information", MB_OK | MB_ICONINFORMATION);
}

Tu vérifies alors avec Spy++, que c'est bien la bonne child affichée qd
la MDI est en foreground...
Avatar
Laura Martignas
Christian ASTOR a écrit :

Oui, tout-à-fait.



Merci beaucoup pour ton aide :)