HeavenForsaker
Messages postés223Date d'inscriptionmercredi 13 juillet 2005StatutMembreDernière intervention 8 août 2011
-
18 janv. 2006 à 21:14
HeavenForsaker
Messages postés223Date d'inscriptionmercredi 13 juillet 2005StatutMembreDerniè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" :
theneoiceman
Messages postés78Date d'inscriptionlundi 14 avril 2003StatutMembreDernière intervention23 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 :)
theneoiceman
Messages postés78Date d'inscriptionlundi 14 avril 2003StatutMembreDernière intervention23 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'.
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à .
HeavenForsaker
Messages postés223Date d'inscriptionmercredi 13 juillet 2005StatutMembreDerniè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.