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

来源:互联网 发布:淘宝店铺禁止客户端 编辑:程序博客网 时间:2024/06/05 05:46

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;    }   


2 0