- /*Compiled: gcc -Wall -o kbhit kbhit.c -lncurses *
- *if see error: curses.h: No such file or directory *
- *Fix this error under RHEL/Fedora/CentOS: *
- *# yum install ncurses-devel ncurses *
- *Fix this error under Debian/Ubuntu: *
- *sudo apt-get install libncurses5-dev libncursesw5-dev*
- */
- #include <stdio.h>
- #include <stdlib.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;
- }
- //该片段来自于http://www.codesnippet.cn/detail/290820135449.html
来源: http://www.codesnippet.cn/detail/290820135449.html