如何在linux下用c语言实现对键盘的监听

如何在linux下用c语言实现对键盘的监听,第1张

自己写函数

#include <stdio.h>  

#include <termios.h>  

  

static struct termios initial_settings, new_settings  

static int peek_character = -1  

void init_keyboard(void)  

void close_keyboard(void)  

int kbhit(void)  

int readch(void)   

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  

}  

   

int main()  

{  

    init_keyboard()  

    while(1)  

    {  

        kbhit()  

        printf("\n%d\n", readch())  

    }  

    close_keyboard()  

    return 0  

}

linux的stdio不支持监听键盘的按键,你需要包含扩展的头文件和库。

比如包含termios.h,这个头文件里有一些终端IO的相关扩展。我们使用tcsetattr来设置一个属性,就可以不用回车就即时监听到按键。

#include <termios.h>

//....其它代码

int in

struct termios new_settings

struct termios stored_settings

tcgetattr(0,&stored_settings)    /* 把当前设置保存起来,以供恢复 */

new_settings = stored_settings

new_settings.c_lflag &= (~ICANON) /* 新设置,将canonical模式取消,屏蔽整行缓存 */

new_settings.c_cc[VTIME] = 0   /* 超时设置为0 */

new_settings.c_cc[VMIN] = 1    /* 读取的最小字符数 */

tcsetattr(0,TCSANOW,&new_settings)

in = getchar()   /* 此时就可以正常的使用getchar()函数来获取一个输入了 */

/* 此时,你可以使用while,并将获得的输入进行处理 */

tcsetattr(0,TCSANOW,&stored_settings)    /* 恢复原设置 */

另外,你可以考虑使用linux/input.h,使用事件监控的方式,来监控键盘事件。这个功能就强大多了,但是,这个 *** 作只适用于本机,也就是说,这个事件,只能监听到与主机直接相连的键盘和鼠标的事件。如果使用ssh登录过去的,是监听不到。关于具体用法,自己搜一下就好。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8466121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-16
下一篇 2023-04-16

发表评论

登录后才能评论

评论列表(0条)

保存