LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2215|回复: 5

请问程序中怎样判断键盘有没有键按下

[复制链接]
发表于 2004-11-30 16:46:34 | 显示全部楼层 |阅读模式
类似于kbhit();
发表于 2004-11-30 17:07:12 | 显示全部楼层
以前有人问过,搜索一下。
发表于 2004-11-30 20:02:25 | 显示全部楼层
我也问过,不过我没用过,所以一直没有实现,没有代码,到现在为止也没见过代码。
发表于 2004-12-1 09:47:59 | 显示全部楼层
在linux里好像有多种解决方式。我用过的这种是通过设置termio来实现的。
/*
*        kbhit
*/
#include <termios.h>
#include <unistd.h>   // for read()

void   init_keyboard(void);
void   close_keyboard(void);
int      kbhit(void);
int     readch(void);


static struct termios initial_settings, new_settings;
static int peek_character = -1;

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()
{
        unsigned 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;
}
 楼主| 发表于 2004-12-1 10:59:48 | 显示全部楼层
谢谢!可否给个具体调用的主函数更清楚点
先是用kbhit判断是否有键按下,然后用readch()判断是
那个键。没有用到curses库吧
 楼主| 发表于 2004-12-1 11:24:10 | 显示全部楼层
谢谢,太好用了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表