C++: GetKeyState() a pour exécuter une seule fois

J'ai besoin d'écouter de touche de clavier états pour ma petite demande.

#include <windows.h>
#include <fstream>
#include <iostream>

using namespace std;

int main()
{
    while(1)
    {
        if(GetKeyState(VK_SPACE) & 0x80)
        {
            cout << "Space pressed.\r\n";
            DoSpaceKeyTask();
        }

        if(GetKeyState(OTHER_KEY) & 0x80)
        {
            cout << "Other key pressed.\r\n";
            DoOtherKeyTask();
        }
    }
    return 0;
}

Une fois que je clique sur certaines touches de mon clavier, ces fonctions a exécuté une seule fois. Ils sont juste quelques petites tâches pour mes applications, ce qui n'est pas liée à ce sujet.

Mon problème est que quand j'appuie sur une touche, il exécute les fonctions quelques fois, en raison de while(1) boucle à quelques reprises au cours de la touche. Je ne peux pas utiliser Sleep() dans ce cas, car elle ne veut toujours pas être efficace.

Je suis à la recherche d'une solution de ce genre.

  1. Je presse la touche ESPACE.
  2. DoSpaceKeyTask() exécute "une fois".
  3. J'appuie sur d'AUTRES clés.
  4. DoOtherKeyTask() exécute "une fois".

J'ai comme 5 touches que j'utilise. Quelqu'un pourrait-il m'aider sur ce cas?

Ps. Si GetKeyState() fonction n'est pas utile sur cette tâche, n'hésitez pas à proposer les vôtres. Ma fonction de connaissances est assez limité sur le C++.

  • 1. Vous souhaitez GetAsyncKeyState pour cette boucle. 2. Vous devez masque avec 0x8000. Aussi, vous pouvez utiliser while (GetAsyncKeyState(...) & 0x8000) à attendre pour aller jusqu'.
  • Voici un bon texte de présentation sur le point 1: blogs.msdn.com/b/oldnewthing/archive/2004/11/30/272262.aspx
  • Salut chris, c'est toujours la même chose avec GetAsyncKeyState et 0x8000. Des idées?
  • Vous devez soit utiliser un état de mécanisme, comme on le voit ci-dessous, ou utiliser quelque chose qui vous informe de touches/déprime, comme une fenêtre ou un crochet.
  • L'état des mécanismes de regarder hacky. Comment puis-je rechercher pour ceux fenêtre/crochet sur Google? Que dois-je en général? Aussi, mon application s'exécute en arrière-plan, tandis que le réel de l'exécution de l'application sur le premier plan. Je veux juste pour automatiser certaines tâches. Comme si vous avez déjà joué à un jeu de RPG, je veux vendre mon ensemble de l'inventaire à un PNJ avec une seule touche.
  • DoSpaceKeyTask() la fonction a juste à cliquer sur chaque élément dans mon inventaire. (la souris cliquez sur prédéfini coordonnées rapidement.) Alors oui, je suis à la recherche d'une solution sur ce point. J'ai utilisé KeyState, juste parce que mes recherches Google, il me l'a montré. Je veux juste obtenir de l'état des touches du clavier, quelle que soit l'application sur le premier plan. Je peux le fermer lorsque cela est nécessaire.
  • Oh, qui efface les choses un peu mieux. La fonction que vous recherchez est SetWindowsHookEx. Il existe assez peu de bons exemples des différents crochets, mais celui que vous voulez, c'est le crochet de la fenêtre de jeu message de la procédure. Crochet pour vérifier les événements clés, et de les gérer de façon appropriée.
  • Merci, je vais regarder dès maintenant. 🙂

InformationsquelleAutor Aristona | 2012-05-28