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 :

Détecter un événement du clavier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Free
    Inscrit en
    Août 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Free
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 4
    Par défaut Détecter un événement du clavier
    Bonjour tout le monde,

    Je suis nouveau parmi vous et c'est mon premier message dans ce site.
    J'ai des connaissances de base dans le langage de programmation C, et j'ai besoin de votre aide.
    J'utilise le logiciel Microsoft visual studio pour mes programmes en C sous Windows et j'aimerais savoir comment peut-on détecter un événement du clavier (exemple appui sur le bouton "ALT") pour effectuer un comportement (exemple écrire un message d'information).

    J'utilise un programme simple exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    main ()
    {
    int i = 1 ;
    while(i)
     printf("pas d appui");
     
    ????????
     
    return 0;
    }
    Mon but est d'ajouter la partie de code manquante qui permet de détecter à n'importe quel moment s'il y a un appui sur la touche du clavier "ALT" et une fois qu'il y a un appui sur ce bouton là, le programme écrit "touche detectee" et change la valeur de i ( exemple : printf("touche detectee"); et i = 0.

    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2013
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 150
    Par défaut
    Bonjour,

    Il me semble qu'il te faut utiliser une bibliothèque pour pouvoir "capter" les touches qui ne font pas partie de la table ASCII. Quoi qu'il en soit l'idée est là, imaginons que la touche que tu veux ne soit pas "alt" mais "a" :
    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
    #include <stdio.h>
     
    int main(void){
     
        char c;
        int i = 1;
        while(i){
     
            if((c=getchar()) == 'a'){
                printf("Touche \"a\" saisie, i = %d\n",i);
                i++;
            }
        }
     
        return 0;
    }

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il faut aussi une bibliothèque (supportée par l'OS) pour pouvoir détecter de manière non-bloquante si une touche a été pressée ou non: Le C standard n'offre pas cette possibilité.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Free
    Inscrit en
    Août 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Free
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 4
    Par défaut
    Merci BooMan pour ta réponse, je vais essayer l'instruction

    Médinoc
    Qu'est ce que ça veut dire : détecter de manière non-bloquante si une touche a été pressée ou non ? et est ce que t'as des exemples concrets ?
    Merci.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Bonjour et bienvenue,

    Qu'est ce que ça veut dire : détecter de manière non-bloquante si une touche a été pressée ou non ? et est ce que t'as des exemples concrets ?
    Cela veut dire que, d'une part, le langage C en lui-même est indépendant de la machine et du système d'exploitation sur lesquels on exécute ses programmes. La bibliothèque standard définie par la norme C prévoit la disponibilité d'une « entrée standard », qui s'exploite comme un fichier. Par défaut, cette entrée standard est reliée au clavier de la console de l'utilisateur, mais elle peut être renvoyée vers le contenu d'un fichier ou la sortie d'un autre processus. C'est cette entrée que tu lis lorsque tu fais getchar() (entre autres).

    Ça signifie également qu'il faut qu'un caractère soit arrivé jusqu'à ton processus. Tant que ce n'est pas le cas (et comme les différents périphériques ont tous un temps d'accès qui leur est propre), la fonction en question va attendre qu'il arrive et, donc, tu ne pourras rien faire d'autre en attendant. En outre, certains systèmes d'exploitation utilisent une console qui utilise une discipline de ligne, qui permet de conserver tous les caractères saisis du côté utilisateur dans un buffer et ne les envoyer au processus qu'à l'appui sur Entrée, ce qui permet à cet utilisateur de corriger éventuellement sa saisie avant de la soumettre. Certaines machines à écrire électroniques des années 1980 étaient d'ailleurs équipées d'un écran LCD rudimentaire pour faire la même chose. Dans ce cas, tu risques d'avoir des surprises côté programme car tu n'obtiendras aucun caractère tant que tu n'auras pas appuyé sur Entrée et, alors, tous ceux que tu aura saisi jusque là vont arriver d'un seul bloc à ton programme.

    D'autre part, « Alt » est, à ma connaissance, une touche spécifique à l'IBM PC (et à ses clones, que l'on utilise aujourd'hui) et est surtout un modificateur, comme Shift. C'est donc une touche qui te permet de saisir un caractère alternatif situé sur la même touche qu'un caractère principal, par exemple le « # ». Donc, aucun caractère n'est émis quand tu appuies seulement sur Alt et ton programme ne recevra rien. Avec des terminaux distants branchés sur des lignes séries, il est impossible de savoir à l'avance si un utilisateur a appuyé ou non sur cette touche. En travaillant en local sur un ordinateur donné, il est possible d'obtenir cette information mais à condition de surveiller directement l'activité du périphérique qui gère le clavier. En réalité, comme c'est un acte relativement commun, cela va être transmis parmi les événements de l'environnement graphique, mais cela veut dire qu'il faudra travailler à un autre niveau et faire de la programmation système. Et bien sûr, ce ne sera pas portable a priori. Il faudra écrire une routine propre à chaque environnement.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Free
    Inscrit en
    Août 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Free
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 4
    Par défaut
    Bonjour,
    Merci pour vos réponses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while(i){
     
            if((c=getchar()) == 'a'){
                printf("Touche \"a\" saisie, i = %d\n",i);
                i++;
            }
    }
    Après avoir essayé le code au dessus, une fois le programme arrive à la ligne if((c=getchar()) == 'a'), il arrête l'affichage et me demande de saisir un caractère (il m'oblige de saisir un caractère avant de continuer).
    Mon but c'est que le programme continue l'affichage en temps réel et sans cesse et une fois il détecte un appui (sans le demander à l'utilisateur), il fais une action (affichage d'un message, incrémenter un compteur,...).

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Bonjour,

    enfaite je retire mon post pas vu que c'était sous windows :s

    Regarde la winapi la doc est pas trop mal foutu sinon comme dit plus haut cherche des lib qui pourrais te simplifier la vie

    Voila je te laisse un peu chercher, bon courage

    j'ai trouvé ça si ça peux t'aider http://www.developpez.net/forums/d10...aison-touches/

  8. #8
    Membre à l'essai
    Homme Profil pro
    Free
    Inscrit en
    Août 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Free
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 4
    Par défaut
    Bonjour Jouana,

    Merci pour ton message, cependant, le fait de me donner des liens et des librairies et me demander d'aller chercher tout seul n'est pas un encadrement ça n'aides pas à avancer . Aller chercher dans d'autres pages pour une simple instruction n'est pas bon, il suffit juste de me montrer cette instruction mais bon merci en tout cas (de toute façon j'ai jeté un coup d’œil sur les liens et j'ai trouver des choses compliqués pour une question très simple)
    Moi j'ai poster ma question ici par ce que je sais qu'il y a des experts qui peuvent me donner l'instruction dans deux trois lignes par ce que je ne voulais pas utiliser de l'orienté objet avec C++ j'ai voulu seulement utiliser un programme simple en C.

    Mais bon après une longue recherche sur le net j'ai pu trouver l'instruction qui me permet de détecter la touche du clavier appuyée par l'utilisateur sans faire une pause du programme parce que getchar() toute seule fait une pause du programme et demande à l'utilisateur de rentrer un caractère.
    La fonction qui permet de faire ça est kbhit()

    exemple d'utilisation simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <conie.h>
    .
    .
    If(kbhit())
    {
       detection=getch() ;
    }
    If (detection == ‘T’)
    {
        Printf(«touche frappée » ) ;
        compteur++
    }
    Voila, mon problème est résolu
    Merci pour tout le monde

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Citation Envoyé par Automato Voir le message
    Mais bon après une longue recherche sur le net j'ai pu trouver l'instruction qui me permet de détecter la touche du clavier appuyée par l'utilisateur sans faire une pause du programme parce que getchar() toute seule fait une pause du programme et demande à l'utilisateur de rentrer un caractère.
    La fonction qui permet de faire ça est kbhit()

    exemple d'utilisation simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <conie.h>
    .
    .
    If(kbhit())
    {
       detection=getch() ;
    }
    If (detection == ‘T’)
    {
        Printf(«touche frappée » ) ;
        compteur++
    }
    Voila, mon problème est résolu
    Merci pour tout le monde
    Malheureusement, c'est loin d'être aussi simple : kbhit(), et conio.h d'une manière générale, ne sont absolument pas portables. C'est pratique pour commencer mais s'appuyer dessus trop longtemps risque de te donner de mauvaises habitudes.

    Ce que l'on essayait de te dire, c'est que la norme C proprement dite ne définit rien de particulier à ce sujet et, en fait, à aucun endroit dans ses 540 pages cette norme n'utilise même le mot « clavier » (keyboard). Et cela parce qu'un micro-processeur ne travaille pas forcément dans un environnement qui en est pourvu. C'est surprenant avec un ordinateur personnel, mais ça commence à le devenir beaucoup moins quand on travaille sur tablette tactile.

    Ça veut dire que, d'une part, il va falloir vérifier que le clavier peut effectivement être lu (ça, c'est acquis) et, d'autre part, te tourner vers les facilités proposées par ton système d'exploitation, ou par une norme plus générale reconnue par le système en question.

    Si tu utilises kbhit(), c'est que tu travailles sous Windows, mais c'est loin d'être le cas de tout le monde. En particulier, beaucoup de gens ici travaillent sous Unix ou Linux. La norme POSIX qui en est issue propose quelque chose de plus général : elle permet de modifier le descripteur d'un fichier ouvert pour rendre non bloquants tous les appels qui le sont par défaut. Ça s'applique à l'entrée standard comme au reste et te permet donc d'arriver à tes fins sans même recourir à kbhit(). Malgré ça, il se peut encore que l'équipement qui t'envoie ces caractères (comprendre : le terminal) ait choisi de les bufferiser avant de te les soumettre. Dans ce cas, il faudra préalablement lui demander également de ne pas le faire.

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

Discussions similaires

  1. Détecter l'évènement "survol d'unTextField"
    Par levit dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 09/03/2008, 23h21
  2. Réponses: 5
    Dernier message: 13/02/2008, 10h15
  3. Réponses: 8
    Dernier message: 18/12/2007, 21h34
  4. Réponses: 3
    Dernier message: 30/10/2007, 12h56
  5. Réponses: 6
    Dernier message: 18/08/2006, 10h22

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