Hello,
J'essaie de créer des petits programmes illustrant le fonctionnement de chacun des type de hook.
J'ai donc un programme principal et une dll pour initier un hook global.
Dans le type de hook WH_CALLWNDPROC qui intercepte les message des fonctions de type SendMessage, j'ai donc une structure de récupération des données du type CWPSTRUCT.
maDLL.dll
la structure "cwpstruct" reçoit effectivement les bonnes données attendues, j'utilise la fonction PostMessage() pour renvoyer ces données vers mon programme principal mais c'est là qu'il se passe un problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 LRESULT CALLBACK CallWndProc (int nCode, WPARAM wParam, LPARAM lParam) { CWPSTRUCT *cwpstruct = (CWPSTRUCT*)lParam; // le paramètre lParam (ou cwpstruct) pointe sur une stucture CWPSTRUCT (contenant les données à traiter pour ce type de hook) if (nCode < 0) return CallNextHookEx(hHook_CWP, nCode, wParam, lParam); switch (nCode) { // nCode est le code envoyé par le système. Lors d'un hook de type WH_CALLWNDPROC si le message est de type case HC_ACTION: // HC_ACTION, alors on peut traiter le message intercepté, sinon le message doit être rejeté car non pertinent pour ce type de hook. if (cwpstruct->message == WM_NULL) { // On ne détecte que les messages WM_NULL envoyés par les fonctions de la famillle SendMessage() & Co. //UninstallCallWndProcHook (hHook_CWP); hProgPrincipal = FindWindow (NULL, AppName_ProgPrincipal); PostMessage (hProgPrincipal, WM_CALLWNDPROCMSG, (WPARAM) cwpstruct->hwnd, (LPARAM) cwpstruct); //wsprintf (buffer, formatHexa, hProgPrincipal); MessageBoxA(0, buffer, buffer, 0); } break; default: break; } return CallNextHookEx (hHook_CWP, nCode, wParam, lParam); }
le paramètre (LPARAM) cwpstruct est sensé renvoyer l'intégralité des données placées dans cette structure, alors que (WPARAM) cwpstuct->hwnd est sensé revoyer que le paramètre hwnd de cette même structure pour contrôler ce paramètre lors du passage.
Individuellement (WPARAM) cwpstuct->hwnd est correctement transmis par PostMessage, mais pas la structure elle-même dans sa totalité (LPARAM) cwpstruct.
Voici le code du prog principal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 BOOL CALLBACK DlgMain(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { RECT rect; switch(uMsg) { // ---------------------------------------------------------------------------------------------------------------------------- DEBUT ---- case WM_INITDIALOG: case WM_INITDIALOG: { } return TRUE; // ---------------------------------------------------------------------------------------------------------------------------- FIN ------ case WM_INITDIALOG: // ---------------------------------------------------------------------------------------------------------------------------- DEBUT ---- case WM_CLOSE case WM_CLOSE: { EndDialog(hDlg, 0); } return TRUE; // ---------------------------------------------------------------------------------------------------------------------------- FIN ------ case WM_CLOSE // ---------------------------------------------------------------------------------------------------------------------------- DEBUT ---- case WM_COMMAND: case WM_COMMAND: { } return TRUE; // ---------------------------------------------------------------------------------------------------------------------------- FIN ------ case WM_COMMAND: // ---------------------------------------------------------------------------------------------------------------------------- DEBUT ---- case WM_CALLWNDPROCMSG case WM_CALLWNDPROCMSG : { CWPSTRUCT *cwpstruct = (CWPSTRUCT*) lParam; wsprintf (buffer, resultat, cwpstruct->hwnd, cwpstruct->message, cwpstruct->wParam, cwpstruct->lParam, wParam); SetDlgItemText (hDlg, IDC_RICHEDIT, buffer); } return TRUE; ... .. .
Comment passer correctement le contenu de ma structure CWPSTRUCT.
Partager