begin process at 2012 05 29 20:10:49
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Systeme

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

mercredi 18 janvier 2006 à 21:14:27 | Problème avec le lParam de la fonction de hook clavier.

HeavenForsaker

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.
0-15
Specifies 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-23
Specifies the scan code. The value depends on the OEM.
24
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
Reserved.
29
Specifies the context code. The value is 1 if the ALT key is down; otherwise, it is 0.
30
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
Specifies the transition state. The value is 0 if the key is being pressed and 1 if it is being released.
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.


jeudi 19 janvier 2006 à 00:34:53 | Re : Problème avec le lParam de la fonction de hook clavier.

theneoiceman

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.
  • 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).
  • 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.
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
jeudi 19 janvier 2006 à 01:12:49 | Re : Problème avec le lParam de la fonction de hook clavier.

HeavenForsaker

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 :
11
00 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
jeudi 19 janvier 2006 à 01:41:42 | Re : Problème avec le lParam de la fonction de hook clavier.

theneoiceman

Réponse acceptée !
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
jeudi 19 janvier 2006 à 02:04:13 | Re : Problème avec le lParam de la fonction de hook clavier.

HeavenForsaker

OK theneoiceman merci beaucoup,
J'avais complétement zappé le signe...
En tout cas c'est on ne peux plus clair !


Cette discussion est classée dans : wm, key, value, is, lparam


Répondre à ce message

Sujets en rapport avec ce message

TEXTURE OPENGL [ par Batman60 ] SALUTje voudrais afficher des textures bmp sur les faces d'un cube ,un défilement de 10 textures par exemple ,qui s'affichent une par une ,la même sur pb avec iwebbrowser2 C++ API Win 32 [ par spyto ] Bonjour,Je tourne en rond, je ne vois pas où ça buggue !!!Voilà, j'ai développé un truc en Win32 pur (j'utilise MSVS.NET C++ 2003)J'ai emprunté une so Dialogue procedure dans une classe [ par bioopovega ] Bonjour,D'abord, je ne sais pas si cela correspond bien au thème, mais je ne sais pas ou le mettre.J'ai un probleme, je crée une boite de dialogue a p [VC++] Problème avec un activeX de lecture registre windows [ par Nyn ] Bonjour!      Je me permets de poster ici (j'espère que c'est la bonne section) car je rencontre des problèmes sur le projet que voici : Je dois réali Le LPARAM de SendMessage: incrémentation [ par sunvi ] Bonjour, Je cherche à envoyer un WM_PARENTNOTIFY à une fenêtre, avec comme WPARAM= WM_LBOTTONDOWN. en regardant sur le site de msdn, j'ai trouvé qu'il menu contextuel étendu ? [ par Clem ] Bonjour ! Je cherche à faire un petit programme qui rajouterai une option dans le menu contextuel des "edit", mais en vain. J'utilise pour détecter MouseHook [ par mouloudh ] Bonjour, J'ai déjà posé une question sur le sujet: comment récupérer le Hook dans une DialogBox, finalement on m'en a déssuadé, et depuis j'ai un peu Lire port PCI [ par scallacs ] Bonjour, J'ai un programme sous VS C++ 6 pour windows XP qui permet de lire un port parallèle branché à une pédale. Le problème est que le hardware


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,352 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales