2010-04-30 4 views
5

Que signifie le code 0x80 en référence aux commandes du clavier dans l'environnement C++ Windows?Que signifie le code 0x80 en référence aux commandes du clavier

Par exemple,

if(GetKeyState('K') & 0x80) { 
    //do something 
} 

Merci à tous!

+0

Je pense que vous avez une faute de frappe dans votre exemple de code - il devrait être GetKeyState (« K ») et 0x8000 – Stewart

+0

il semble fonctionner dans mon application comme c'est pourtant? – Paz

+2

Que voulez-vous dire par "travailler"? Si vous ne savez pas ce qu'il est censé faire, comment savez-vous que cela fonctionne? – Stewart

Répondre

1

Selon the documentation

La valeur de retour indique l'état de la clé virtuelle spécifiée:
Si le bit de poids fort est 1, la touche est enfoncée; sinon, c'est fini.
Si le bit de poids faible est 1, la touche est basculée. Une touche, telle que la touche CAPS LOCK, est activée si elle est activée. La touche est désactivée et décochée si le bit de poids faible est 0. Le voyant d'une touche à bascule (le cas échéant) sur le clavier est allumé lorsque la touche est activée, et désactivé lorsque la touche est décochée.

Peut-être avec une clé non toggleable (un 'K'), le faible ordre - les bits (terme ambigu peut-être qu'ils veulent dire 0x0080?) et ordre supérieur (0x8000) font la même chose?

+0

La documentation MSDN n'est pas ambigu - le bit de poids fort d'un SHORT est 0x8000. Le bit de poids faible est 0x0001. Je sais que ceci est vrai parce que quand j'ai jamais utilisé cette fonction, je l'ai habituellement testé avec <0 plutôt que & 0x8000 - il réalise la même chose. – Stewart

+0

@Stewart: C'est ce que je pense aussi - mais alors, pourquoi dans le monde ce travail (si cela fonctionne effectivement)? ... En outre, ce que vous avez déclaré n'a rien à voir avec si le "bit de poids faible" est 0x0080 ou 0x0001 .. –

+0

Je ne pense pas que j'ai jamais eu besoin d'un bit faible. Je soupçonne que le code "fonctionne" parce que la documentation ne dit rien sur la signification des bits 1 à 14. Pour une clé enfoncée non-togglable 0xfffe serait une valeur de retour parfaitement valeur au sens des docs – Stewart

7

Mise à jour

Une rafale de downvotes m'a propulsé dans l'enquête sur cet autre. Voici comment les valeurs de retour (en hexadécimal) de GetKeyState fonctionnent. Je n'obtiens pas tout à fait la propriété toggle d'une clé comme k mais je suppose qu'il y a un état par défaut à partir duquel elle bascule.

0  Default State, key up 
ff80 Default state, key down 
1  Toggled, key up 
ff81 Toggled, key down 

Alors 0xff80 est ajouté chaque fois que le bit de poids fort doit être réglé et le bit d'ordre logique. Donc maintenant nous savons pourquoi l'approche 0x80 fonctionne --- puisque le bit de poids fort de l'octet inférieur est également défini!

Vieille réponse

GetKeyState retourne un SHORT où si le bit de poids fort est 1 cela signifie que la clé est en place. L'opération bitwise AND avec 0x80 vérifie simplement si ce bit est 1 puisque, en binaire, 0x80 est 10000000.

Par conséquent, la déclaration GetKeyState('K') & 0x80 retournerait 0x80 si le bit de poids fort de la valeur retournée par GetKeyState('K') est 1 et 0 si le bit de poids fort est 0.

+1

Cependant, le bit de poids fort d'un 'SHORT' serait' 0x8000' –

+0

Ce serait le bit haut d'un BYTE, mais la fonction renvoie SHORT, qui est de 16 bits – Stewart

+0

Mis à jour ma réponse avec la solution! – Jacob

3

Les MSDN documentation of the function états:

Si le bit de poids fort est 1, la clé est vers le bas; sinon, c'est fini.

peu sage et avec 0x80 vous donne le bit de commande, les if vérifie si le résultat est nul ou non nul et, en substance vérifie la valeur de ce bit.

Cette vérification ressemble cependant à une erreur car GetKeyState() renvoie un SHORT et pour vérifier le bit de poids fort d'un court vous devez bit-sage et avec 0x8000.
Donc, je vous suggère de vérifier la valeur de retour avec un débogueur et de vérifier comment cela fonctionne dans la réalité.

2

Je pense que vous voulez dire 0x8000, pas 0x80. Si tel est le cas, vous devriez consulter la documentation (http://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx) qui a ceci à dire sur la valeur de retour de GetKeyState: -

La valeur de retour indique l'état de la clé virtuelle spécifiée comme suit:

• Si le bit de poids fort est 1, la touche est enfoncée; sinon, c'est fini. • Si le bit de poids faible est 1, la touche est basculée. Une touche, telle que la touche CAPS LOCK, est activée si elle est activée. La touche est désactivée et décochée si le bit de poids faible est 0. Le voyant d'une touche à bascule (le cas échéant) sur le clavier est allumé lorsque la touche est activée, et désactivé lorsque la touche est décochée.

0x80 ne veut pas dire quoi que ce soit pour autant que je sais que

+0

'0x80' va fonctionner, vérifiez ma réponse. – Jacob

+0

Cela fonctionnera, mais vous dépendez d'un comportement non documenté. 0x8000 est meilleur. – Stewart