8
votes

En utilisant getkeystate ()

Je voudrais faire basculer un événement booléen lorsqu'une touche est enfoncée. Plus précisément, la clé de 'S'. J'ai été signalé à la fonction GetkeyState (), qui fonctionne supposée sous l'API Win32. Je comprends le code ASCII pour la lettre 's' est 115, et mon code est donc comme suit: xxx

Cependant, cela ne fonctionne pas. Pourquoi? Voici la référence MSDN: http: // msdn .microsoft.com / fr-US / US / Bibliothèque / MS646301% 28V = vs.85% 29.aspx ... "Si le bit à faible commande est 1, la clé est basculée"


1 commentaires

Il suffit de le comparer à zéro -> voir: Comment puis-je obtenir les bits de haute et de faible commande d'un court-circuit?


5 Réponses :


21
votes

De ce que je comprends, vous devez faire:

if( GetKeyState(115) & 0x8000 )
{
    <EVENT>
}


3 commentaires

Merci, j'ai essayé cela mais toujours mon événement ne se produit pas quand j'appuie 's'. Le programme compile tout cependant bien. J'utilise Win32 API, je manque autre chose? Le compilateur reconnaît évidemment la fonction ...


Peut-être que vous voulez GetASynCeyState . getkeystate doit être appelé en réponse à l'événement du clavier.


Les codes de clé virtuelle pour les touches de lettre correspondent aux codes ASCII des lettres majuscules. Et vous pouvez même utiliser un char au lieu du int qui rend le code plus lisible. Alors essayez getkeystate ('s')



-10
votes

peu en retard pour cela, mais le bit de commande élevé est 0x80000000 pas 0x8000, changez ceci et cela fonctionnera bien.

L'autre bit - utile pour rien - il agit comme si vous appuyez sur Caps Caps Verrouiller lorsque vous avez enfoncé le lshift.



11
votes

Depuis court, le bit de la commande à haut ordre équivaut à un bit de signe.

Par conséquent, pour tester si une clé donnée est enfoncée, il suffit de tester si la valeur renvoyée par getkeystate () code> est négatif:

if (GetKeyState('S') < 0) {
    // The S key is down.
} else {
    // The S key is up.
}


0 commentaires

-3
votes

J'utilise une variable globale BOOL Altgr code>

Exemple: P>

void Editor::HandleKey(char car) {

    bool shift = false;
    //bool altgr = false;
    bool printable = false;

    if (car == 27) SendMessage(hwnd, WM_DESTROY, 0, 0);

    if ((GetKeyState(VK_CAPITAL) & 0x0001) == 1) shift = true;
    if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000) shift = true;
    // if(GetKeyState(VK_RMENU) & 0x80000000 == 0x80000000) altgr = true;
    if (car == 18) altgr = true; 


0 commentaires

-3
votes

Parfois, vous voulez utiliser une combinaison de clés forte>.

Pour éviter les situations lorsqu'une combinaison de clés (par exemple: vk_shift && vk_left) satisfait deux conditions: P>

#include <windows.h>  

    ...

    while (1)
    {
        if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetAsyncKeyState(VK_LEFT) & 0x8000))
        {
            Sleep(200);
            std::cout << "Shift LEFT pressed" << std::endl;
        }

        if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetAsyncKeyState(VK_RIGHT) & 0x8000))
        {
            Sleep(200);
            std::cout << "Shift RIGHT pressed" << std::endl;
        }

        if (GetAsyncKeyState(VK_RIGHT))
        {
            std::cout << "RIGHT key pressed" << std::endl;
        }

        if (GetAsyncKeyState(VK_LEFT))
        {
            std::cout << "LEFT key pressed" << std::endl;
        }
   }


1 commentaires

Cela semble plutôt non liée à la question de l'OP.