Bonjour,
Je rencontre un problème pour récupérer les lettres majuscules et les valeurs issues de l'utilisation des touches 'Alt' et 'Alt Gr' à l'interieur d'un Hook clavier Low Level.
Je ne récupère en effet que la valeur principale des touches appuyées.
Par exemple:
- Je récupère toujours le caractère 'a' même quand l'une des touches 'shift' droit/gauche' ou 'caps lock' est enfoncée.
- Je récupère toujours le caractère '(' même quand l'une des touches 'shift' droit/gauche', 'caps lock' ou 'Alt/ Alt Gr' est enfoncée
Ci dessous le code concerné :
(Mon projet est une Win32 application console sous Visual C++ 6)
La méthode main où j'enregistre le hook clavier:
La méthode de gestion du hook:
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 void main(int argc, char ** argv) { MSG msg; keyboard_ll_hook = SetWindowsHookEx( WH_KEYBOARD_LL, hook_keyboard_low_level, GetModuleHandle( NULL ), 0); while ( 1 ) { // 1° //if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) // 2° if (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage (&lmsg); } Sleep( 0 ); } }
J'ai essayé de récupérer l'état du clavier par la méthode "GetKeyboardState" (3°) sans succès (les valeurs des touches 'shift' et 'Alt/Alt Gr' n'était pas mis à jour par l'appui sur les touches correspondantes).
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 LRESULT CALLBACK hook_keyboard_low_level ( int nCode, WPARAM wParam, LPARAM lParam ) { PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam; BYTE keyboardState[256]; unsigned short result; if ( nCode == HC_ACTION ) { // 3° //GetKeyboardState(keyboardState); // 4° for(i = 0 ; i < 255 ; i++) { keyboardState[i] = GetAsyncKeyState(i) & 0xff; } // 5° //ToAscii(key->vkCode, key->scanCode, keyboardState, &result, 0); // 6° ToAsciiEx(key->vkCode, key->scanCode, keyboardState, &result, 0, GetKeyboardLayout(0)); printf("\t\t--> %c\n", (result& 0xff)); } return CallNextHookEx( keyboard_ll_hook, nCode, wParam, lParam); }
J'ai donc opté pour un remplissage 'à la main' avec la méthode "GetAsyncKeyState" (4°) qui me renvoie des valeurs plus cohérentes avec l'état des touches utilisées.
Il me semble que mon problème viens de la méthode "ToAsciiEx" (6°) que j'utilise peut être mal.
J'ai essayé la méthode plus "simple" "ToAscii"(5°) avec le même résultat.
Si vous avez une idée ou une remarque, je suis preneur.
Merci
Partager