Problème avec le lParam de la fonction de hook clavier.

Résolu
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 18 janv. 2006 à 21:14
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011 - 19 janv. 2006 à 02:04
Bonjour,

Voici la fonction prise sur MSDN :

LRESULT CALLBACK KeyboardProc(
int code,
WPARAM wParam,
LPARAM lParam
);


et le paramètre qui nous interresse :

* lParam :
[in] Specifies the repeat count, scan code, extended-key flag, context
code, previous key-state flag, and transition-state flag. For more
information about the lParam parameter, see Keystroke Message Flags. This parameter can be one or more of the following values. <dl> * : 0-15Specifies
the repeat count. The value is the number of times the keystroke is
repeated as a result of the user's holding down the key. * : 16-23Specifies the scan code. The value depends on the OEM. * : 24<dd>Specifies
whether the key is an extended key, such as a function key or a key on
the numeric keypad. The value is 1 if the key is an extended key;
otherwise, it is 0. * : 25-28<dd>Reserved. * : 29<dd>Specifies the context code. The value is 1 if the ALT key is down; otherwise, it is 0. * : 30<dd>Specifies the previous key state. The value is 1 if the key is down before the message is sent; it is 0 if the key is up. * : 31<dd>Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.
</dd>
</dl>
Si j'ai bien compris ce paramètre tiens sur 31 bits, hors voila ce que
je reçoit a l'appel de cette fonction lors de la pression de la touche
"a" :



au WM_KEYDOWN : 1048577

au WM_KEYUP : -1072693247



dans le WM_KEYDOWN ça donne en binaire :

1 0000 0000 0000 0000 0001 => 2^0 + 2^20 = 1 + 1048576 = 1048577



dans le WM_KEYUP ça donne en binaire :

11 1111 1110 1111 1111 1111 1111 1111



On a donc pas de nombre sur 31 bits ! on a 21 bits sur WM_KEYDOWN et 30 bits sur WM_KEYUP.

Pourriez vous m'éclairer la dessus, merci d'avance.

4 réponses

theneoiceman Messages postés 78 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 avril 2010
19 janv. 2006 à 01:41
Ah oui c'est vrai... une derniere chose a savoir.

le lparam est un DWORD mais tu peux le prendre comme un entier SIGNE.

Donc le bit le plus à gauche représente le signe. Si il est à , alors
la valeur décimale correspondante sera considérée comme négative.

Ici le bit le pls à gauche est à 1 cela indique donc que la
valeur entiere correspondate sera négative. Le fait de prendre un bit
pour indiquer le signe indique aussi que le domaine des valeurs
entieres correspondantes est divisé par 2.

En effet au lieu d'aller de 0 à 2 puissance 32, les valeurs vont de -2^30 à 2^31 si je me souviens bien.

donc le nombre -1 072 693 247 est tout à fait plausible car -(2^30)=-1
073 741 824 ==> -(2^30) < valeur dans lparam ce qui confirme donc
ce que je dis.

Donc n'oublie pas, quand la variable est dite "signee", cela signifie
que le bit le plus à gauche est pris par la machine comme le signe du
nombre (1 negatif, 0 positif). Le lparam est lu comme un entier (signé
par défaut donc) d'où le resultat obtenu : -1 072 693 247.

J'ai du mal à croire que ce que j'ai dit ait été clair previens moi si tu comprends pas... c'st un peu embetant a expliquer je le concede :)


Voilà
Mess with the best, die like the rest
3
theneoiceman Messages postés 78 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 avril 2010
19 janv. 2006 à 00:34
Pour info a ce que tu viens d'ecrire :

Tout d'abord, l'information dans le lparam n'est pas codée sur 31 bits mais sur 32 bits.
Ensuite je vais réécrire de facon plus convenable les conversions que tu as trouvé pour l'appui et le relachement de la touche 'a' :
Les 32 bits de chaque valeur pris par le lparam sont indiqués afin que tu puisses comprendre les différences :
J'ai donc fait apparaitre en rouge la partie de la valeur que tu as oublié lors de l'appui sur WM_KEYDOWN et j'ai mis en vert les changements ayant eu lieu entre l'appui et le relachement de la touche 'a'.

WM_KEYDOWN ==> 1408577 ==> 00000000000100000000000000000001
WM_KEYUP ==> -1072693247 ==> 11000000000100000000000000000001

Tu peux donc remarquer que lors du WM_KEYUP, 2 bits sont changés , le 30 et le 31.
<li>Bit 30 : est mis à 1 si la touche était pressée precedemment (ce qui est le cas car il y a eu un WM_KEYDOWN sur cette touche 'a' donc c'est normal que ce bit soit a 1 lors du WM_KEYUP).</li><li>Bit 31 : est mis à 1 si la touche est relachée... nous sommes en train de recevoir un WM_KEYUP donc forcément la touche est relachée donc il est normal que ce bit soit à 1.</li>Pour conclure, nous pouvons dire que le paramètre lparam est une valeur de 32 bits TOUT LE TEMPS !!! Ce n'est pas une variable à taille changeante selon les besoins, elle a une taille fixe ( qui peut etre 8,16, 32 ou 64 bits, ici c'est 32 bits )!
Les 2 valeurs que tu as donc trouvées étaient bonnes mais tu as juste mal interprété ces données.
Si tu n'es pas sûr, prends ta calculatrice windows, mets la en affichage scientifique, tape ton nombre en decimal, clique sur le bouton Bin (qui te fera le changement en mode binaire en un rien de temps) et prense bien a utiliser des D-mots et pas des Q-mots ou des trucs du genre (un D-mot, ou DWORD correspond à 32 bits pour info) et tu retrouveras les resultats que je t'ai ecrit. Tout sera plus clair pour toi dès que tu auras vu ça.
Bien, j'espère avoir été clair donc si tu as un doute relance encore un post j'y repondrai de nouveau si je suis là .

Bonne prog !!!

Mess with the best, die like the rest
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
19 janv. 2006 à 01:12
Merci theneoiceman pour ta réponse,

Ok pour l'information sur 32 bits du WM_KEYDOWN, par contre pour le
WM_KEYUP même en mettant la calculatrice en mode scientifique avec le
DWORD on a toujours pas le bon résultat.

Corrige moi si je me trompe :



Ton résultat :

1100 0000 0001 0000 0000 0000 0000 0001

ça fait donc en décimal :

2^0 + 2^20 + 2^30 + 2^31 = 3222274049

On devrait trouver 1072693247
0
HeavenForsaker Messages postés 223 Date d'inscription mercredi 13 juillet 2005 Statut Membre Dernière intervention 8 août 2011
19 janv. 2006 à 02:04
OK [auteurdetail.aspx?ID=84691 theneoiceman] merci beaucoup,

J'avais complétement zappé le signe...

En tout cas c'est on ne peux plus clair !
0
Rejoignez-nous