6
votes

Détecter les frappes

Je dois détecter une touche de frappe, sans que l'utilisateur appuyait sur Entrée. Quelle est la manière la plus élégante?

I.e. Si l'utilisateur frappe la lettre q , sans appuyer sur entrer , le programme fait quelque chose.

c

5 commentaires

Cela dépend de l'environnement. Est-ce que Windows (Message de la fenêtre Keystroke)? La console Linux (Getch pourrait-elle fonctionner ou quelque chose de ncurses)? Linux Gnome / KDE? Application Java?


Son étiqueté et intitulé comme C, donc ses fenêtres, Linux ou GTK, je pense.


Après avoir essayé d'atteindre cet objectif sur Mac OS X en utilisant une combinaison de SETVBUF et fcntl , je suis maintenant tenté d'aller lire la source NCurses ...


@Mathepic, pourrait également être un système intégré, ajouter UC / OS-II, ITron et une foule d'autres à la liste ;-)


C'est Linux basé sur, spécifiquement ubuntu.


3 Réponses :


1
votes

Il n'y a pas de bon moyen de le faire de manière portant, autant que je sache, autrement que d'utiliser une bibliothèque comme ncurses , qui fournit la fonction getch (VOID) .

Remarque: il apparaît getchar (void) à partir de stdio.h attend jusqu'à ce que la touche Entrée soit enfoncée puis alimentez vos caractères, de sorte que cela ne fonctionnera pas. < / p>


6 commentaires

Oui, mais vous pouvez désactiver la mise en mémoire tampon de ligne avec RAW () / cbreft () qui permet aux personnages de revenir instantanément au programme. Voir tldp.org/howto/ncurses-programming-howto/init.html #Rawcbreak Pour plus d'informations.


Je parlais de getchar , pas le NCurses fonction getch . getch fonctionnera bien (en supposant qu'il lit sur les ncurses et le mode brut), mais getchar ne sera pas.


ON * NIX, STDIN est une ligne tamponnée par défaut si elle est connectée à une TTY et complètement tamponnée si un fichier ou un tuyau. Si c'est une tty, vous pouvez faire des choses à ses modes, mais cela interagit généralement mal avec Stdio. Les ncurses sait comment faire cela de manière quelque peu indépendante de la plate-forme.


@RBERTEG: Ligne tamponnée VS nonufferée VS entièrement tamponnée uniquement pour la sortie de STDIO - Il n'a aucun effet sur l'entrée.


@Chris, nous sommes tous deux en fin d'effet, mais j'avais tort en détail. L'entrée de terminal est presque certainement en mémoire tampon, mais par le pilote de périphérique TTY, pas Stdio, et la mise en mémoire tampon affecterait la lecture (2) ainsi que toute bibliothèque construite sur celle-ci telle que STDIO. Vous devez demander poliment le pilote TTY d'arrêter de faire tamponner de manière non très portable (pas même à travers diverses variantes * Nix, sans parler de Windows) pour obtenir des traits clés unique.


@RBERTEG: Les TERMIOS devraient fonctionner correctement sur une variante * NIX de moins de 20 ans ...



3
votes

dans Windows code> Fournit la fonction _getch (void) code> qui peut être utilisé pour lire la frappe sans écho-les (imprimer vous-même si vous le souhaitez) .

#include <conio.h>
#include <stdio.h>

int main( void )
{
   int ch;

   puts( "Type '@' to exit : " );
   do
   {
      ch = _getch();
      _putch( ch );
   } while( ch != '@' );

   _putch( '\r' );    // Carriage return
   _putch( '\n' );    // Line feed  
}


1 commentaires

Pas besoin de #include ici, je pense.



7
votes

dans UNIX / POSIX, la manière standard de cela consiste à placer l'entrée en mode non canonique avec tcsetattr: xxx

voir la page de l'homme termios (3) pour plus de détails ( et probablement plus d'informations que vous vouliez savoir).


0 commentaires