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 :

Comment détecter la frappe d'une touche ?


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 76
    Points : 87
    Points
    87
    Par défaut Comment détecter la frappe d'une touche ?
    Comment détecte-t-on en C la frappe d'une touche du clavier?
    J'aimerais faire une fonction qui renvoie le code ASCII de ladite touche et une autre fonction pour les touches non asciiables (entendre : qu'on ne peut pas associer à un caractère ni à une suite de caractères, comme Ctrl, Alt, Maj, Arret défil etc...).

    Le mieux, si ce n'est pas trop vous demander, ce serait que ces fonctions utilisent une interruption : ça m'aiderait à comprendre comment elles marchent (je ne suis pas du tout à l'aise avec).

    En fait, ça ressemblerait à INKEY$ de Qbasic (pour les connaisseurs).
    C'est à dire que l'appel de cette fonction ne suspendrait pas le déroulement du programme (par exemple une boucle).

    Je suis encore un débutant, malgré tout ce que vous m'avez déjà appris, maisj'en guérirai (enfin, j'espère).
    Merci d'avance.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 71
    Points : 78
    Points
    78
    Par défaut
    si tu utilises visual c++, tu peux utiliser _kbhit suivi de getch.

  3. #3
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut

    Voici un petit bout de code pour détecter une touche et afficher son code ascii
    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
    int touche ;
     
    do
      {
      if(kbhit()!=0) /* Détecte une frappe de touche */
        {
        touche = getch() ; /* Lecture de la touche */
        if(touche==0) /* Si une touche étendue (flêches ou autres) */
          {
          touche = getch() ; /* Lecture de la touche */
          printf("Code étendu : 0^%c(%.2Xh)\n", touche, touche) ;
          }
        else /* Touche standard */
          {
          printf("Code standard : %c(%.2Xh)\n", touche, touche) ;
          }
        }
      }
    while(touche!=0x1B) ; /* Sortie si touche ESCAPE */
    Comme tu peu le voir, les touches "non asciiables" (ou touches à codes étendues) sont codés en deux fois, le code '0', puis un autre code. Il faut lire deux fois la touche
    Pour les touches "Impr écran", "Arrêt défil" et "Pause", je crois qu'il est possible d'aller lire leurs états à un certain emplacement mémoire, mais je ne sais pas où !
    Et pour finir, la fonction kbhit() n'utilise pas la fonction d'interruption du clavier, elle ne fait que lire l'état du buffer et de renvoyer vrai ou faux si un caractère est présent ou non.

    Voila toutes les précisions que je peu te fournir.

    Bye...
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 79
    Points : 37
    Points
    37
    Par défaut
    si t'es sur UNIX il faut utiliser les termcaps, j'ai un exemple si tu veux

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    poste le plz c est bien pour tous le monde
    ++

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Comment détecte-t-on en C la frappe d'une touche du clavier?
    Pas de solution en C standard => spécifique à chaque OS / compilo, précise....

  7. #7
    Expert éminent
    Avatar de Ditch
    Inscrit en
    Mars 2003
    Messages
    4 160
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2003
    Messages : 4 160
    Points : 9 634
    Points
    9 634
    Par défaut
    le getch() est portable non?

    Dans ce cas, c=getch(); fonctionne... Tout depend de la touche que tu attends aussi! Pour les fleches, le getch ne fonctionne pas (car compose de deux caracteres) mais pour les lettre et les chiffres, c ok.

    C'est la solution bete et mechante mais qui depanne pour certains trucs

    Didier Danse

    Most Valuable Profesionnal SharePoint
    Microsoft Certified Application Developer
    Mes articles sur developpez.com
    Mon site perso


  8. #8
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    Salut,

    getch fait partie de conio.h qui est une librarie Windows.
    On peut l'utiliser sous Unix avec ncurses.
    "Je suis incapable d'expliquer ce qui se passa ensuite : je lâchai quelque chose, quelque chose à quoi je m'agrippais depuis toujours sans m'en rendre compte. Je m'enfonçais dans une obscurité chaude, moelleuse et protectrice, tandis qu'un loup montait la garde par mes propres yeux."

  9. #9
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par Ditch
    le getch() est portable non?
    non. Comme l'a savamment précisé HW, il n'y a PAS de solution standard en C
    Un historique local pour Visual Studio 2005 et 2008 :
    http://www.codeplex.com/VLH2005

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 76
    Points : 87
    Points
    87
    Par défaut
    Je suis sous dos, sur un intel 386 ou un pentium 2, ça dépend des fois.
    J'utilise turbo c++ 1.0 je crois.
    Je pensais que getch() stoppait le déoulement du programme en attendant la frappe d'une touche, enfin, peut-être pas dans tous les cas, je ne sais pas, mais j'aimerais que le programme n'attende pas qu'on tape sur une touche pour continuer, vous voyez ce que je veux dire?
    En tout cas, merci.
    J'attends vos réponses.

  11. #11
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    bah kbhit comme expliquer au dessus. Il y a un bout de code tout fait. Je vois pas ce qu'on peut ajouter de plus.

    de plus conio.h n'est pas une librairie windows mais borland
    il y a du linge sur la corde à linge

  12. #12
    Membre éclairé
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Points : 742
    Points
    742
    Par défaut
    Salut
    Citation Envoyé par Bubonik software
    Je suis sous dos...
    J'utilise turbo c++ 1.0 je crois.
    Le bout de code que j'ai poster fonctionne sous tc, il suffit d'inclure le conio.h pour le getch() et le kbhit().

    Citation Envoyé par Bubonik software
    mais j'aimerais que le programme n'attende pas qu'on tape sur une touche pour continuer, vous voyez ce que je veux dire?
    La fonction kbhit() qui te renvoie vrai ou faux si un caractère à été frappé sur le clavier n'est pas bloquante par rapport à la fonction getch() qui, elle, attend la frappe d'une touche. Ce code (voir plus haut ) n'est jamais en attente d'une touche. Lorsqu'une touche est présente (ou à été détectée), on vient la lire et l'analyser, et ensuite le programme peu faire autre chose.

    Bye...
    - Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
    - Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 76
    Points : 87
    Points
    87
    Par défaut
    Merci, j'essaye tout de suite!

  14. #14
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par la drogue c'est mal
    de plus conio.h n'est pas une librairie windows mais borland
    Dsl, je pars me faire fouetter de suite
    "Je suis incapable d'expliquer ce qui se passa ensuite : je lâchai quelque chose, quelque chose à quoi je m'agrippais depuis toujours sans m'en rendre compte. Je m'enfonçais dans une obscurité chaude, moelleuse et protectrice, tandis qu'un loup montait la garde par mes propres yeux."

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 76
    Points : 87
    Points
    87
    Par défaut
    Eh bien, MERCI! ça fait plaisir d'avoir tant d'aide.
    J'ai grâce à vous enfin réussi à faire un programme avec une boucle qui s'arrête autrement qu'avec Ctrl+Alt+Suppr! 8)
    Encore merci!

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Ditch
    le getch() est portable non?

    Dans ce cas, c=getch(); fonctionne... Tout depend de la touche que tu attends aussi! Pour les fleches, le getch ne fonctionne pas (car compose de deux caracteres) mais pour les lettre et les chiffres, c ok.
    getch() n'est pas portable. Il a été introduit par Borland avec Turbo C, et est repris par DJGPP et Microsoft (à peu près)

    <PC-DOS>
    getch() permet tout à fait de lire les flêches (touches étendues). Il suffit de tester avec kbhit() et de lire le second caractère si le premier est 0.

    Voilà un petit programme qui devrait t'éclairer:
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #include <conio.h>
    #include <ctype.h>
     
    #define EOL "\n\r"
     
    enum
    {
       ESC = 27,
       dummy
    };
     
    int main (void)
    {
       int end = 0;
       while (!end)
       {
          if (kbhit ())
          {
             int c = getch ();
     
             switch (c)
             {
             case ESC:
                end = 1;
                break;
     
             case 0:
                if (kbhit ())
                {
                   c = getch ();
                   cprintf ("Touche etendue : %3d '%c'" EOL, c, c);
                }
                break;
     
             default:
                if (isprint (c))
                {
                   cprintf ("Touche normale : %3d '%c'" EOL, c, c);
                }
                else
                {
                   cprintf ("Touche normale : %3d" EOL, c);
                }
             }
          }
       }
       return 0;
    }
    </PC-DOS>
    Pas de Wi-Fi à la maison : CPL

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par la drogue c'est mal
    de plus conio.h n'est pas une librairie windows mais borland
    <conio.h> n'est pas une 'librairie', (ni d'ailleurs une bibliothèque, car 'librairie' n'est qu'un horrible anglicisme de 'library'), mais un fichier d'interface qui contient de définitions de macros, de constantes et de types, ainsi que des déclaration de fonctions (prototypes) et des objets publics (extern...).

    La bibliothèque qui contient l'implémentation des fonctions et des objets est liée plus au moins automatiquement à l'application par le compilateur, l'éditeur de lien, l'IDE etc.
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Août 2003
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2003
    Messages : 76
    Points : 87
    Points
    87
    Par défaut
    Ah, c'est pour ça que quand on édite le fichier conio.h (ainsi que beaucoup d'autres), on ne voit pas comment les fonctions ont été 'fabriquées'!

    J'avais éssayé et... je m'étais demandé pourquoi je continuais à vouloir apprendre le C!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment détecter l'appui sur une touche du clavier?
    Par Cygnus Saint dans le forum C++
    Réponses: 2
    Dernier message: 17/09/2009, 20h31
  2. Comment détecter l'appui sur une touche hors de l'application ?
    Par freezerhm dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/04/2008, 22h53
  3. Réponses: 2
    Dernier message: 20/03/2006, 18h05
  4. [CF][C#/PPC] Comment être à l'écouter d'une touche du clavier ?
    Par freddyboy dans le forum Windows Mobile
    Réponses: 6
    Dernier message: 18/05/2005, 17h32
  5. [Servlet] Comment détecter la fin d'une session HTTP
    Par cocula dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/04/2005, 17h27

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