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:
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 );
    }
}
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
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 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).
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