Est t-on vraiement obligé de passer par une dll pour faire un hook clavier ? Si oui pourquoi ?
Est t-on vraiement obligé de passer par une dll pour faire un hook clavier ? Si oui pourquoi ?
C'est bon j'ai réussit a linker cette ****** de dll, mais le problème c'est que quant j'utilise cette fonction dans mon programme (voir ci-dessous) ça ne fait rien (elle renvoi 0 je sais pas si c'est normal)
PS: ceci vient de l'exemple de la faq
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 int DLLEXPORT installeLeHookClavier( void ) { if( !hookClavier ) { hookClavier = SetWindowsHookEx(WH_KEYBOARD_LL, fonctionIntercepteClavierLowLevel, moduleCourant, 0); } return (int) hookClavier; }
si tu es sous windows 98, le hook WH_KEYBOARD_LL ne marche pas, comme dit dans la faq
Quelle touche veux-tu intercepter ? Il est fort probable que WH_KEYBOARD te suffise
Mon problème est résolut, pour ce j'ai utilisé Microsoft Visual C++ v6.0![]()
dsl, je revient sur mon problème....
J'ai remplacé cette ligneEnvoyé par nico-pyright(c)
par celle ci
Code : Sélectionner tout - Visualiser dans une fenêtre à part SetWindowsHookEx(WH_KEYBOARD_LL, fonctionIntercepteClavierLowLevel, moduleCourant, 0);
Et ça ne fonctionne pas (la compilation réussit mais quant je presse les touches rien ne se passe) J'ai même essayé avec la touche A (VK_A) mais rien à faire....
Code : Sélectionner tout - Visualiser dans une fenêtre à part SetWindowsHookEx(WH_KEYBOARD, fonctionIntercepteClavierLowLevel, moduleCourant, 0);
Y a t'il une autre modification à faire ?
PS: j'ai pas changé le nom de la fonction (fonctionIntercepteClavierLowLevel)
montre ton code
(le changement de nom de fonction n'interfere en rien)
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 #include <windows.h> #define VK_A 65 typedef struct { DWORD vkCode; DWORD scanCode; DWORD flags; DWORD time; } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT; HINSTANCE moduleCourant; HHOOK hookClavier; HWND fenetre; BOOL statut; LRESULT CALLBACK fonctionIntercepteClavierLowLevel (int nCode, WPARAM wParam, LPARAM lParam) { if(nCode == HC_ACTION) { KBDLLHOOKSTRUCT kbStruct = *((KBDLLHOOKSTRUCT *)lParam); switch(wParam) { case WM_KEYDOWN: if (kbStruct.vkCode == VK_A) { if (statut) { PostMessage(fenetre,WM_USER+99,0,0); statut=false; return 1; } else { PostMessage(fenetre,WM_USER+99,1,0); statut=true; return 1; } } if (kbStruct.vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL)) // bloque control+echap (ceci sert juste a voir si le hook a marché) return 1; } } return CallNextHookEx(hookClavier, nCode, wParam, lParam); } extern "C" int __stdcall installeLeHookClavier(HWND handle) { if( !hookClavier ) { statut=false; fenetre=handle; hookClavier = SetWindowsHookEx(WH_KEYBOARD, fonctionIntercepteClavierLowLevel, moduleCourant, 0); } return (int) hookClavier; } extern "C" void __stdcall ArreteLeHookClavier() { if(hookClavier) { UnhookWindowsHookEx(hookClavier); hookClavier = 0; } } BOOL WINAPI DllMain (HINSTANCE hDll, DWORD dwReason, LPVOID Reserved) { if (dwReason == DLL_PROCESS_ATTACH) { moduleCourant = hDll; } if (dwReason == DLL_PROCESS_DETACH) { ArreteLeHookClavier(); } return 1; }
c'est parce que le hook WH_KEYBOARD ne fonctionne pas pareil que le hook WH_KEYBOARD_LL
dans la callback, il faut tester wParam == VK_A pour savoir si la touche a été appuyée
n'hésite pas à regarder dans msdn
Pas besoin de la structure "KBDLLHOOKSTRUCT" alors..?
non, pas besoin
teste juste wParam
J'ai fait comme ça mais ça fonctionne seulement quant la fenêtre possède le focus clavier (donc c'est plus un hook)
D'ou vient le 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 LRESULT CALLBACK fonctionIntercepteClavierLowLevel (int nCode, WPARAM wParam, LPARAM lParam) { switch(wParam) { case VK_F11: PostMessage(fenetre,WM_USER+99,0,0); break; case VK_F10: PostMessage(fenetre,WM_USER+99,1,0); break; } return CallNextHookEx(hookClavier, nCode, wParam, lParam); }
il est bien dans une dll ? tu le raccroches bien au module courant dans le dll_process_attach ? (comme dans l'exemple)
Oui c'est bien dans la DLL, sinon j'ai rien changé de plus que la fonction "fonctionIntercepteClavierLowLevel" et "WH_KEYBOARD_LL" en "WH_KEYBOARD"
ca devrait marcher ...
retourne 0 temporairement après le postmessage (pour bloquer l'action), pour voir si ca bloque bien l'action
Je vient de faire le test (j'ai mis "return 0;") , le fontionnement et vraiment étrange :
Que le programme ai le focus ou pas, la touche n'est pas bloquée.
(Pour voir si mon programme régit avec les touches F10 et F11 j'ai mis ces touches dans les accélérateurs clavier)
-La DLL envoie le message à l'appli seulement si la fenêtre à le focus.
-L'application reçoit le message de la DLL avant le message WM_COMMANDE envoyé par l'accélérateur.
Donc le ""hook"" ne fonctionne pas.
Peut être que "WH_KEYBOARD" ne marche que sous Win98 et pas sur des version supèrieures... !?!?
EDIT: je vient d'essayer de mettre WM_USER+95 plutôt que WM_USER+99, je me suis dit que le conflit pouvait éventuellement venir de la mais le résultat et le même![]()
peux-tu faire voir le code de ton exe ? (l'appel aux fonctions du hook)
Voila la partie du code qui concerne les fonctions de la DLL
Je doute que le problème viene du programme lui même car lorsque je recompile la DLL avec "WM_COMMANDE_LL" et fait les modifications necsessaires tout marche à merveille.
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 extern "C" int __stdcall installeLeHookClavier(HWND); extern "C" void __stdcall ArreteLeHookClavier(); //switch sur les messages de l'application case WM_CREATE: //initialisation du programme installeLeHookClavier(hwnd); WSADATA WSAData; //pour utiliser les sockets WSAStartup(MAKEWORD(2,0), &WSAData); return 0; //j'ai mis juste les messages ou aparaisent les fonction de la DLL case WM_CLOSE: if(MessageBox(hwnd,"Etes vous certain de vouloir quitter?","Confirmation",MB_YESNO | MB_ICONQUESTION)==IDYES) { //fermeture des sockets (c'est un prog. qui utilise les sockets) PostQuitMessage(0); ArreteLeHookClavier(); //Termine le hook clavier (fonction contenue dans la DLL) } return 0; default: //Messages non traités return DefWindowProc(hwnd, uMsg, wParam, lParam);mais pas sous Win98
![]()
personne arrive a résoudre mon problème![]()
Si quelqu'un arrive à faire un hook claiver qui marche avec win98 (avec WH_KEYBOARD et non WH_KEYBOARD_LL) ça serait simpa de me passer le code.
Merci
salut, je t'ai fait un petit exemple, je te le poste ce soir, dès que je pourrais uploader
Partager