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

C++ Discussion :

Capter un évennement touche clavier


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut Capter un évennement touche clavier
    Bonjour,

    Je recherche une solution simple pour capter les événements des touches clavier utilisateur.
    En gros voila l'algorithme que j'aimerai implémenter en C ou C++:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Tant que vrai
     
       Attendre touche clavier
       Récupérer code touche tapée
     
       Appeler ma fonction avec touche tapée
     
    Fin Tant que
    Au cours de mes recherches j'ai cru comprendre qu'il fallait surement "hooker" la touche mais je n'ai rien trouvé de très concret.
    Si vous avez même un bout de code à montrer ça serait sympas.

    Merci !

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    _getch() sous visual ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Je travaille sous Code::Blocks.
    Est ce que cela est censé fonctionner ?

  4. #4
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Si tu développes en mode console:

    C'est assez dépendant de ta plateforme, en fait... Il n'y a rien de vraiment portable...

    Sous Windows, je te dirais GetAyncKeyState, sous Linux, je te dirais d'aller voir du côté de libcurses.

    Si tu développes en mode GUI:
    Ben utiliser les event de ton framework, tout simplement

  5. #5
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Sous Windows, inclus "conio.h" et utilise la fonction _kbhit().


    Sous Linux, le plus simple est souvent de faire passer le terminal en mode Raw (par défaut, il est en mode Cooked).
    Pour Linux, tu peux utiliser les fonctions ci-dessous, qui dépendent de "curses.h" si je me souviens bien :
    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
    35
    36
    37
    38
    // Same signature as Windows' one...
    int _kbhit ( void ) {
     
        struct timeval tv = { 0, 0 };
        fd_set readfds;
     
        FD_ZERO(&readfds);
        FD_SET(STDIN_FILENO, &readfds);
     
        int k = select(STDIN_FILENO+1, &readfds, NULL, NULL, &tv) ;
        return (k==1) ;
    }
     
    static struct termios cooked ;      // Cooked mode parameters.
    static bool raw_active = false ;    // Current terminal mode.
     
    void set_raw ( void ) {
     
        struct termios raw;
     
        if (raw_active)
            return ;
     
        tcgetattr(STDIN_FILENO,&cooked);
        raw = cooked;
        cfmakeraw(&raw);
        tcsetattr(STDIN_FILENO,TCSANOW,&raw);
        raw_active = true ;
    }
     
    void set_cooked ( void ) {
     
        if (!raw_active)
            return ;
     
        tcsetattr(STDIN_FILENO,TCSANOW,&cooked);
        raw_active = false ;
    }

  6. #6
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    J'ai oublié l'exemple d'utilisation...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (!_kbhit()) {
      // Attente de l'évènement clavier...
    }
    int c = getchar(); // c contient le caractère tapé par l'utilisateur.
    Ne pas oublier que les caractères tapés ne sont pas purgés : pour ça, il faut utiliser ce genre de code...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Purge du buffer d'entrée.
    while (_kbhit())
      getchar();

Discussions similaires

  1. [Win32] Récupérer un appui touche clavier
    Par elsargento dans le forum MFC
    Réponses: 19
    Dernier message: 06/05/2006, 11h05
  2. Simuler un appui de touche clavier
    Par Floo dans le forum Assembleur
    Réponses: 5
    Dernier message: 03/12/2004, 17h04
  3. [JEditorPane]Captures des touches claviers
    Par splend_f dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 17/05/2004, 14h57
  4. [Applet]simuler une touche clavier
    Par mat10000 dans le forum Interfaces Graphiques en Java
    Réponses: 19
    Dernier message: 12/12/2003, 16h23
  5. envoie de touche clavier
    Par psfox2001 dans le forum DirectX
    Réponses: 1
    Dernier message: 13/03/2003, 21h56

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