一个是make code,也就是键被按下和按住不放时产生
另一种是break code,在键被释放时产生。
每个键都有自己唯一的make code和break code。
提供一个我在Linux下的实现,就是使用ioctl 改变终端I/O模式。
测试程序在“a”健被按下时退出。
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <linux/kd.h>
int main(void)
{
struct termios oldtermios,newtermios
int oldmode
unsigned short key
int i
if((tcgetattr(fileno(stdin),&oldtermios))<0)
{
perror("tcgetaddr error")
exit(1)
}
if((tcgetattr(fileno(stdin),&newtermios))<0)
{
perror("tcgetaddr error")
exit(1)
}
newtermios.c_lflag &= ~(ICANON|ECHO|ISIG)
newtermios.c_iflag = 0
newtermios.c_cc[VMIN] = 0
newtermios.c_cc[VTIME] = 1 //=0延时0 ,=1延时1s
if(tcsetattr(fileno(stdin),TCSAFLUSH,&newtermios))
{
perror("tcsetattr error")
exit(1)
}
ioctl(fileno(stdin),KDGKBMODE,&oldmode)
if(ioctl(fileno(stdin),KDSKBMODE,K_RAW))
{
perror("ioctl error")
exit(1)
}
while(1)
{
if(read(fileno(stdin),&key,sizeof(key))>0)
printf(" key = 0x%x \n",key)
if (key == 0x1e)//key a down , exit.
break
key = 0
}
ioctl(fileno(stdin),KDSKBMODE,oldmode)
tcsetattr(fileno(stdin),TCSANOW,&oldtermios)
return 0
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ma100/archive/2007/02/07/1504270.aspx
以上代码,我在suse liux下,没有成功。原因是 if(ioctl(fileno(stdin),KDSKBMODE,K_RAW)) 没有成功。
参考下面文章:http://www.linuxjournal.com/article/2783,需要弄清楚ioctl对键盘的 *** 作。
键盘的键值?你想想,你们老师上课的时候,让你们拿出哪本教材,是不是喊xx必须1神马的,键盘上的键也是这样的,每个键都有一个名称,所以你才能在电脑上打出相应的字来,但电脑只认机器语言,它可搞不懂a是神马,b是神马,所以为了让电脑知道我们摁下的是哪个键,我们就给键盘上的每个键一个唯一的编码,这个编码是二进制的,电脑就能识别了。这个编码,就是键值
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)