您的位置:首页 > 其它

通过select较高效的捕获和处理鼠标键盘事件

2016-04-18 10:17 351 查看
select监听这些文件描述符的状态,若有一个发生变化则返回,否则阻塞。
#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>
#include <fcntl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc,char **argv)
{
int fd, retval;
char buf[6];
fd_set readfds;
struct timeval tv;

// 打开鼠标设备
fd = open( "/dev/input/mice", O_RDONLY );
// 判断是否打开成功
if(fd<0) {
printf("Failed to open \"/dev/input/mice\".\n");
exit(1);
} else {
printf("open \"/dev/input/mice\" successfuly.\n");
}

int fd_kb;
struct input_event event_kb;
fd_kb = open("/dev/input/event1", O_RDONLY); //键盘输入
if(fd_kb <= 0)
{
printf("open device error\n");
return 0;
}

int fd_mouse;
struct input_event event_mouse;
fd_mouse = open("/dev/input/event4", O_RDONLY); //鼠标输入
if(fd_mouse <= 0)
{
printf("open device error\n");
return 0;
}

while(1) {
// 设置最长等待时间
tv.tv_sec = 5;
tv.tv_usec = 0;

FD_ZERO( &readfds );
FD_SET( fd, &readfds );
FD_SET( fd_kb, &readfds );
FD_SET( fd_mouse, &readfds );

int max=fd>fd_kb?(fd>fd_mouse?fd:fd_mouse):(fd_kb>fd_mouse?fd_kb:fd_mouse);

retval = select( max+1, &readfds, NULL, NULL, &tv );//有文件描述符的状态发生变化(变为可读)或者超时和错误就返回,否则就阻塞
if(retval==0) {
printf( "Time out!\n" );
}else if(retval<0){
printf( "error!\n" );
}else{						//判断是哪个文件描述符的状态发生了变化,进行处理即可

//鼠标位置
if(FD_ISSET(fd,&readfds))
{
// 读取鼠标设备中的数据
if(read(fd, buf, 6) <= 0) {
continue;
}
// 打印出从鼠标设备中读取到的数据
printf("Button type = %d, X = %d, Y = %d, Z = %d\n", (buf[0] & 0x07), buf[1], buf[2],   buf[3]);
}

//键盘点击
if(FD_ISSET(fd_kb,&readfds))
{
if(read(fd_kb, &event_kb, sizeof(event_kb)) == sizeof(event_kb))
{
if (event_kb.type == EV_KEY)
{
//if (event_kb.value == 0 || event_kb.value == 1)//1表示按下,0表示释放,会检测到两次
if (event_kb.value == 1)//键按下
{
//printf("key %d %s\n", event_kb.code, (event_kb.value) ? "Pressed" : "Released");
if(event_kb.code == KEY_ESC)
break;
if(event_kb.code == KEY_Q)
printf("q\n");
if(event_kb.code == KEY_W)
printf("w\n");
if(event_kb.code == KEY_E)
printf("e\n");
if(event_kb.code == KEY_R)
printf("r\n");
}

}

}
}

//鼠标点击
if(FD_ISSET(fd_mouse,&readfds))
{
if(read(fd_mouse, &event_mouse, sizeof(event_mouse)) == sizeof(event_mouse))
{
if(event_mouse.type = EV_REL)
{
if(event_mouse.code == REL_WHEEL)
printf("REL_WHEEL %d\n", event_mouse.value);//-1表示下滑,1表示上滑
}

if(event_mouse.code == BTN_LEFT && event_mouse.value==1)//左键按下,1表示按下,0表示释放。不然会检测到两次
printf("left down: %d\n", event_mouse.code);

if(event_mouse.code == BTN_RIGHT && event_mouse.value==1)
printf("right down: %d\n", event_mouse.code);

if(event_mouse.code == BTN_MIDDLE && event_mouse.value==1)
printf("middle down: %d\n", event_mouse.code);

}
}

}

}
close(fd);
close(fd_kb);
close(fd_mouse);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: