Detection clavier en C ANSI
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Salut les gars...
je recherche la fonction qui serait l'équivalent de "_kbhit" de la librairie conio.h
en effet, cette librairie n'existe pas sous linux.
mon but:
detecter qd l'utilisateur appuie sur une touche du clavier, pour sortir d'une boucle...
la fonction "getchar" ne convient pas car elle necessite l'appui sur "entree"...
je veux en gros lancer ma boucle, partir boire un cafe, et revenir un jour ou l'autre et arreter le prog en apuyant sur une touche...
mon pb est que toutes les fonctions d'I/O que g trouvées pour l'instant sont "bloquantes"
si kunkun a une piste, merci d'avance :)
.O
(_)__... Castor
je recherche la fonction qui serait l'équivalent de "_kbhit" de la librairie conio.h
en effet, cette librairie n'existe pas sous linux.
mon but:
detecter qd l'utilisateur appuie sur une touche du clavier, pour sortir d'une boucle...
la fonction "getchar" ne convient pas car elle necessite l'appui sur "entree"...
je veux en gros lancer ma boucle, partir boire un cafe, et revenir un jour ou l'autre et arreter le prog en apuyant sur une touche...
mon pb est que toutes les fonctions d'I/O que g trouvées pour l'instant sont "bloquantes"
si kunkun a une piste, merci d'avance :)
.O
(_)__... Castor
A voir également:
- Detection clavier en C ANSI
- Télécharger clavier arabe - Télécharger - Divers Web & Internet
- Comment taper / sur clavier - Guide
- Changer clavier qwerty en azerty - Guide
- Clavier de l'ordinateur - Guide
- Clavier iphone chiffre et lettre - Guide
4 réponses
NOM
termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain,
tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed,
cfsetispeed, cfsetospeed, tcgetpgrp, tcsetpgrp - Consulter
ou indiquer les attributs de terminaux, le contrôle de
ligne, la vitesse de transmission et le GID du processus
en avant-plan sur un terminal.
c bien ce que je pensais, c par rapport au terminal... mais bon je copntinue l'exploration qd mm ds ce man...
.O
(_)__... Castor
termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain,
tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed,
cfsetispeed, cfsetospeed, tcgetpgrp, tcsetpgrp - Consulter
ou indiquer les attributs de terminaux, le contrôle de
ligne, la vitesse de transmission et le GID du processus
en avant-plan sur un terminal.
c bien ce que je pensais, c par rapport au terminal... mais bon je copntinue l'exploration qd mm ds ce man...
.O
(_)__... Castor
Voici un code extrait des sources du livre "Beginning Linux Programming" de Neil Matthews chez Wrox
(voi le chargement sur http://www.wrox.com )
#include <stdio.h>
#include <termios.h>
#include <term.h>
#include <curses.h>
#include <unistd.h>
static struct termios initial_settings, new_settings;
static int peek_character = -1;
void init_keyboard();
void close_keyboard();
int kbhit();
int readch();
int main()
{
int ch = 0;
init_keyboard();
while(ch != 'q') {
printf("looping\n");
sleep(1);
if(kbhit()) {
ch = readch();
printf("you hit %c\n",ch);
}
}
close_keyboard();
exit(0);
}
void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ISIG;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}
void close_keyboard()
{
tcsetattr(0, TCSANOW, &initial_settings);
}
int kbhit()
{
char ch;
int nread;
if(peek_character != -1)
return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
nread = read(0,&ch,1);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
if(nread == 1) {
peek_character = ch;
return 1;
}
return 0;
}
int readch()
{
char ch;
if(peek_character != -1) {
ch = peek_character;
peek_character = -1;
return ch;
}
read(0,&ch,1);
return ch;
}
Allways close to Open Source...
Johan Daine
(voi le chargement sur http://www.wrox.com )
#include <stdio.h>
#include <termios.h>
#include <term.h>
#include <curses.h>
#include <unistd.h>
static struct termios initial_settings, new_settings;
static int peek_character = -1;
void init_keyboard();
void close_keyboard();
int kbhit();
int readch();
int main()
{
int ch = 0;
init_keyboard();
while(ch != 'q') {
printf("looping\n");
sleep(1);
if(kbhit()) {
ch = readch();
printf("you hit %c\n",ch);
}
}
close_keyboard();
exit(0);
}
void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ISIG;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}
void close_keyboard()
{
tcsetattr(0, TCSANOW, &initial_settings);
}
int kbhit()
{
char ch;
int nread;
if(peek_character != -1)
return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
nread = read(0,&ch,1);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
if(nread == 1) {
peek_character = ch;
return 1;
}
return 0;
}
int readch()
{
char ch;
if(peek_character != -1) {
ch = peek_character;
peek_character = -1;
return ch;
}
read(0,&ch,1);
return ch;
}
Allways close to Open Source...
Johan Daine
mais je vais y jeter un coup d'oeil, merci jisisv
.O
(_)__... Castor