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

GetKeyNameText me renvoie toujours la lettre 'G'

16 réponses
Avatar
Pascal Rito
Bonjour =E0 tous.
Je suis en train de travailler sur le hook system de l'API Windows et
je me heurte =E0 un probl=E8me.
Comme ToAscii ne g=E8re pas les dead keys, je me suis rabattu sur
GetKeyNameText et le soucis c'est que cette fonction me retourne
toujours la lettre 'G' (en vraie elle retourne 1, c=E0d la longueur de
'G' et inscrit 'G' dans le buffer).

Vois mon code :

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if ((nCode =3D=3D HC_ACTION) && (wParam =3D=3D WM_KEYDOWN))
{
char nomTouche[256] =3D "";
int i =3D 0;


// On r=E9cup=E8re la touche
GetKeyNameText(lParam, nomTouche, 256);
printf("Traduction : ");
for(i =3D 0; i < 256; i++) printf("%c", nomTouche[i]);
printf("\n");
}
// Renvoi des messages au syt=E8me pour permettre d'autres hooks
return CallNextHookEx(hHook, nCode, wParam, lParam);
}

Si quelqu'un pouvait m'expliquer pourquoi j'ai ce probl=E8me, je vous en
serais reconnaissant.

6 réponses

1 2
Avatar
Pascal Rito
On 30 nov, 21:00, Christian ASTOR wrote:
On 29 nov, 20:11, Pascal Rito wrote:

> Donc j'ai corrigé comme tu me le proposes, et j'ai toujours ce
> problème :

Dans un de mes vieux Keyloggers, je teste :

        if(nCode == HC_ACTION && ( wParam == WM_KEYDOWN | | wParam ==
WM_SYSKEYDOWN ) & !IsModifierKey(pkbhs->vkCode))
        {
        BOOL bAltGrDown = GetKeyState(VK_RMENU) & 0x8000;
        BOOL bAltDown = GetKeyState(VK_LMENU) & 0x8000;
        // ... etc...
        }

avec :

BOOL
IsModifierKey(DWORD vkCode)
{
   return
           VK_CONTROL == vkCode || VK_RCONTROL == vkC ode || VK_LCONTROL ==
vkCode ||
           VK_SHIFT == vkCode || VK_RSHIFT == vkCode || VK_LSHIFT == vkCode
||
           VK_MENU == vkCode || VK_LMENU == vkCode || VK_RMENU == vkCode;

}



Excuse moi mais je n'ai pas saisi l'intérêt de ta fonction. De ce que
j'ai compris, elle retourne TRUE si vkCode est l'une de ces touches.
Et ensuite dans ta fonction CALLBACK, tu n'entre pas dans ta condition
si cette fonction IsModifierKey vaut TRUE alors qu'après tu traites le
cas de VK_RMENU et VK_LMENU par exemple.
Si j'ai bien saisi la logique de ta fonction, le traitement de
VK_RMENU et VK_LMENU ne seras jamais fait car si on entre dans la
condition, c'est que vkCode n'est pas l'une de ces touches (entre
autres).
Pourrais-tu m'éclaircir sur ce point ? Et aussi me dire pourquoi la
répétition des touches est quand même prise en compte alors que
j'ai :
// Pour éviter les répétitions
// Bit 30 : Spécifie si la touche est maintenue (si TRUE, on passe
notre chemin)
if (((DWORD)lParam & 0x40000000) != FALSE)
return CallNextHookEx (hHook, nCode, wParam, lParam);

Merci
Avatar
Christian ASTOR
On 30 nov, 23:12, Pascal Rito wrote:

Si j'ai bien saisi la logique de ta fonction, le traitement de
VK_RMENU et VK_LMENU ne seras jamais fait car si on entre dans la
condition, c'est que vkCode n'est pas l'une de ces touches (entre
autres).
Pourrais-tu m'éclaircir sur ce point ?



Si, le traitement sera fait : c'est pour éviter d'enregistrer le
premier appui sur Shift par exemple
(on ne logge que si on a Shif+Touche, pas Shift seul)

Et aussi me dire pourquoi la
répétition des touches est quand même prise en compte alors que
j'ai :
    // Pour éviter les répétitions
    // Bit 30 : Spécifie si la touche est maintenue (si TRUE, on pa sse
notre chemin)
    if (((DWORD)lParam & 0x40000000) != FALSE)
            return CallNextHookEx (hHook, nCode, wParam, lPar am);



Le "repeat count", soit HIWORD(lParam) & KF_REPEAT n'est normalement
pas pris en compte par un LowLevel hook, mais bien pris par un hook
clavier classique (avec une DLL)
(je viens de retester les 2 hooks sur XP SP2...)
Avatar
Pascal Rito
On 1 déc, 12:47, Christian ASTOR wrote:
On 30 nov, 23:12, Pascal Rito wrote:

> Si j'ai bien saisi la logique de ta fonction, le traitement de
> VK_RMENU et VK_LMENU ne seras jamais fait car si on entre dans la
> condition, c'est que vkCode n'est pas l'une de ces touches (entre
> autres).
> Pourrais-tu m'éclaircir sur ce point ?

Si, le traitement sera fait : c'est pour éviter d'enregistrer le
premier appui sur Shift par exemple
(on ne logge que si on a Shif+Touche, pas Shift seul)

>Et aussi me dire pourquoi la
> répétition des touches est quand même prise en compte alors que
> j'ai :
>     // Pour éviter les répétitions
>     // Bit 30 : Spécifie si la touche est maintenue (si TRUE, on passe
> notre chemin)
>     if (((DWORD)lParam & 0x40000000) != FALSE)
>             return CallNextHookEx (hHook, nCode, wParam, lP aram);

Le "repeat count", soit HIWORD(lParam) & KF_REPEAT n'est normalement
pas pris en compte par un LowLevel hook, mais bien pris par un hook
clavier classique (avec une DLL)
(je viens de retester les 2 hooks sur XP SP2...)



Pardon pour le temps de réponse, mais j'étais ailleurs ces derniers
temps.
Sinon j'ai tenté quelques manipulations pour m'en sortir avec ce Alt,
et je crois que j'ai réussi à m'en sortir en faisant comme ceci :
http://pastebin.com/m1bbe819
(Je préfère la coloration syntaxique de ce site plutôt que rien du
tout)

Je voudrais surtout que l'on me confirme les lignes 28, 79 et 168,
pour savoir ci ce que j'ai fait fonctionnera bel et bien chez tout le
monde (je pense aux Windoziens NT) ou si ces lignes de codes auront un
résultat différent en fonction des ordinateurs, claviers, etc.

Aussi je voudrais une dernière aide (normalement). Lorsque Caps lock
est sur 'On', et que j'appuie sur '_', cela m'affiche bien '8'. Mais
lorsque je combine 'Shift' + '_', cela m'affiche '_' et non '8'.
Comme régler ce problème ?

Merci.
Avatar
marc
On 6 déc, 22:37, Pascal Rito wrote:

Aussi je voudrais une dernière aide (normalement). Lorsque Caps lock
est sur 'On', et que j'appuie sur '_', cela m'affiche bien '8'. Mais
lorsque je combine 'Shift' + '_', cela m'affiche '_' et non '8'.
Comme régler ce problème ?



C'est le comportement normal.. (avec notepad)
Tous les 'case' sont inutiles aussi
Pour Alt, tu te compliques la vie , au lieu de sauter les 'modifier
keys', mais si ça marche sous XP, ça marchera en principe sous NT
(meme noyau)...
Avatar
Pascal Rito
On 7 déc, 11:27, marc wrote:
On 6 déc, 22:37, Pascal Rito wrote:

> Aussi je voudrais une dernière aide (normalement). Lorsque Caps lock
> est sur 'On', et que j'appuie sur '_', cela m'affiche bien '8'. Mais
> lorsque je combine 'Shift' + '_', cela m'affiche '_' et non '8'.
> Comme régler ce problème ?

C'est le comportement normal.. (avec notepad)
Tous les 'case' sont inutiles aussi
Pour Alt, tu te compliques la vie , au lieu de sauter les  'modifier
keys', mais si ça marche sous XP, ça marchera en principe sous NT
(meme noyau)...



Pourrais-tu m'expliquer comment faire plus simplement ? Comment puis-
je éviter les 'case' et aussi comment faire simple avec 'Alt' ?
Avatar
marc
Pascal Rito a écrit :

> Pour Alt, tu te compliques la vie , au lieu de sauter les  'modifier
> keys', mais si ça marche sous XP, ça marchera en principe sous NT
> (meme noyau)...

Pourrais-tu m'expliquer comment faire plus simplement ? Comment puis-
je éviter les 'case' et aussi comment faire simple avec 'Alt' ?



Comme ça a été dit au-dessus pour 'Alt' mais si ta méthode marche,
c'est bon., et pour les 'case', tu les enlèves, vu que GetKeyNameText
() le fait déjà.
1 2