IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[débutant] Récupérer le statut d'une touche sur le clavier


Sujet :

Windows

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut [débutant] Récupérer le statut d'une touche sur le clavier
    Bonjour à tous,

    Je suis en train de créer une petite application du genre de PONG.
    Lorsque l'utilisateur déplace la raquette avec la touche "flèche droite" une multitude de messages WM_KEYDOWN(VK_RIGHT,0) sont envoyés à ma fenêtre. Le problème c'est que le temps que le thread gère tous les messages, si on maintient la touche appuyée, la raquette continue à bouger même lorsqu'on à laché la touche.
    Je voudrais donc, avant chaque déplacement, que mon programme vérifie si la touche est bien enfoncée ou non.
    En chechant j'ai trouvé GetKeyState() et GetAsyncKeyState().
    Mais j'ai lu que la première se référait au messages traités par le thread courant.
    J'aimerais donc que la fonction en question renvoie l'état de la touche au moment de l'appel de la fonction.
    Le problème de GetAsyncKeyState c'est que la fenetre doit avoir le focus, je voudrais savoir si la touche est pressée même si la fenetre courante n'a pas le focus.
    Je sais que c'est possible vu que c'est comme cela que fonctionnent les spywares.

    Est-ce qu'il existe une telle fonction?

    Merci d'avance de vos réponses (si vous avez une autre solution à me proposer, je suis preneur).

    EDIT :

    Ci joint un petit test pour GetAsyncKeyState() qui ne marche pas.
    Que faudrait-il faire pour qu'il marche? (Il se peut que j'ai mal comris ce qu'écrivait la MSDN sur cette fonction)

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2005
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 513
    Points : 416
    Points
    416
    Par défaut
    il faut que tu fasses un hook, sur le clavier dans une DLL pour que tu puisses détecter l'appuie sur les touches du clavier sans que ton app est le focus.
    je ne sais pas ce que ca vaut, mais j'ai trouvé ca:
    http://tcharles.developpez.com/simul/#hooks

    sinon tu as toujours la MSDN pour référence!

  3. #3
    mat.M
    Invité(e)
    Par défaut
    Non pas forcement , il suffit de placer GetAsyncKeyState non pas dans la boucle des messages et le switch ...case mais plutot avant le while GetMessage....DispatchMessage...TranslateMessage

    Je t'enverrai tout a l'heure un bout de code si j'y pense ( heure de Montreal )

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Voilà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    int PASCAL WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    {
    MSG msg;
    int i=0;
    if( !InitApp( hInstance, nCmdShow ) )
    { MessageBox( NULL, "Erreur Creation Application", "Erreur", MB_OK );
    return 0;
    }
    // init();
    while( 1 )
    { 
    if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )//
    {
    if( !GetMessage( &msg, NULL, 0, 0 ) )
    return msg.wParam;
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    else
    {
    AfficherEcran();
    if (GetAsyncKeyState('A')) Y+=10;
    if (GetAsyncKeyState('Z')) X-=10;
    if (GetAsyncKeyState('X')) X+=10;
    if (GetAsyncKeyState('Q')) Y-=10;
     
     
    }
    } 
    
    }
    


  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 180
    Points : 90
    Points
    90
    Par défaut
    Merci beacoup!

    Spartan03

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/09/2006, 10h31
  2. Réponses: 3
    Dernier message: 03/06/2006, 16h59
  3. Réponses: 7
    Dernier message: 16/03/2006, 20h54
  4. Réponses: 7
    Dernier message: 30/06/2005, 10h06
  5. [Débutant] Récupérer les paramètres d'une routine
    Par nifty dans le forum Assembleur
    Réponses: 5
    Dernier message: 18/04/2005, 14h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo