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

select监听这些文件描述符的状态,若有一个发生变化则返回,否则阻塞。

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>      
  2. #include <stdlib.h>      
  3. #include <linux/input.h>      
  4. #include <fcntl.h>      
  5. #include <sys/time.h>      
  6. #include <sys/types.h>      
  7. #include <sys/stat.h>      
  8. #include <unistd.h>      
  9.   
  10. int main(int argc,char **argv)      
  11. {      
  12.     int fd, retval;      
  13.     char buf[6];      
  14.     fd_set readfds;      
  15.     struct timeval tv;      
  16.   
  17.     // 打开鼠标设备      
  18.     fd = open( "/dev/input/mice", O_RDONLY );      
  19.     // 判断是否打开成功      
  20.     if(fd<0) {      
  21.         printf("Failed to open \"/dev/input/mice\".\n");      
  22.         exit(1);      
  23.     } else {      
  24.         printf("open \"/dev/input/mice\" successfuly.\n");      
  25.     }      
  26.       
  27.     int fd_kb;       
  28.     struct input_event event_kb;    
  29.     fd_kb = open("/dev/input/event1", O_RDONLY); //键盘输入    
  30.     if(fd_kb <= 0)    
  31.     {    
  32.             printf("open device error\n");    
  33.             return 0;    
  34.     }  
  35.       
  36.     int fd_mouse;      
  37.     struct input_event event_mouse;         
  38.     fd_mouse = open("/dev/input/event4", O_RDONLY); //鼠标输入    
  39.     if(fd_mouse <= 0)    
  40.     {    
  41.             printf("open device error\n");    
  42.             return 0;    
  43.     }  
  44.       
  45.       
  46.     while(1) {      
  47.         // 设置最长等待时间      
  48.         tv.tv_sec = 5;      
  49.         tv.tv_usec = 0;      
  50.       
  51.         FD_ZERO( &readfds );      
  52.         FD_SET( fd, &readfds );      
  53.         FD_SET( fd_kb, &readfds );   
  54.         FD_SET( fd_mouse, &readfds );   
  55.       
  56.         int max=fd>fd_kb?(fd>fd_mouse?fd:fd_mouse):(fd_kb>fd_mouse?fd_kb:fd_mouse);  
  57.           
  58.         retval = select( max+1, &readfds, NULL, NULL, &tv );//有文件描述符的状态发生变化(变为可读)或者超时和错误就返回,否则就阻塞      
  59.         if(retval==0) {      
  60.             printf( "Time out!\n" );      
  61.         }else if(retval<0){  
  62.             printf( "error!\n" );   
  63.         }else{                      //判断是哪个文件描述符的状态发生了变化,进行处理即可  
  64.           
  65.             //鼠标位置  
  66.             if(FD_ISSET(fd,&readfds))   
  67.             {      
  68.                 // 读取鼠标设备中的数据      
  69.                 if(read(fd, buf, 6) <= 0) {      
  70.                     continue;      
  71.                 }      
  72.                 // 打印出从鼠标设备中读取到的数据      
  73.                 printf("Button type = %d, X = %d, Y = %d, Z = %d\n", (buf[0] & 0x07), buf[1], buf[2],   buf[3]);      
  74.             }    
  75.               
  76.             //键盘点击  
  77.             if(FD_ISSET(fd_kb,&readfds))   
  78.             {      
  79.                 if(read(fd_kb, &event_kb, sizeof(event_kb)) == sizeof(event_kb))    
  80.                 {    
  81.                     if (event_kb.type == EV_KEY)    
  82.                     {    
  83.                         //if (event_kb.value == 0 || event_kb.value == 1)//1表示按下,0表示释放,会检测到两次    
  84.                         if (event_kb.value == 1)//键按下    
  85.                         {    
  86.                                 //printf("key %d %s\n", event_kb.code, (event_kb.value) ? "Pressed" : "Released");    
  87.                                 if(event_kb.code == KEY_ESC)    
  88.                                         break;    
  89.                                 if(event_kb.code == KEY_Q)    
  90.                                     printf("q\n");                                     
  91.                                 if(event_kb.code == KEY_W)    
  92.                                     printf("w\n");      
  93.                                 if(event_kb.code == KEY_E)    
  94.                                     printf("e\n");      
  95.                                 if(event_kb.code == KEY_R)    
  96.                                     printf("r\n");      
  97.                         }    
  98.     
  99.                     }    
  100.                     
  101.                 }       
  102.             }    
  103.               
  104.             //鼠标点击  
  105.             if(FD_ISSET(fd_mouse,&readfds))   
  106.             {      
  107.                 if(read(fd_mouse, &event_mouse, sizeof(event_mouse)) == sizeof(event_mouse))    
  108.                 {                                       
  109.                     if(event_mouse.type = EV_REL)    
  110.                     {    
  111.                         if(event_mouse.code == REL_WHEEL)           
  112.                             printf("REL_WHEEL %d\n", event_mouse.value);//-1表示下滑,1表示上滑    
  113.                     }       
  114.          
  115.                     if(event_mouse.code == BTN_LEFT && event_mouse.value==1)//左键按下,1表示按下,0表示释放。不然会检测到两次    
  116.                         printf("left down: %d\n", event_mouse.code);    
  117.                             
  118.                     if(event_mouse.code == BTN_RIGHT && event_mouse.value==1)    
  119.                         printf("right down: %d\n", event_mouse.code);    
  120.                             
  121.                     if(event_mouse.code == BTN_MIDDLE && event_mouse.value==1)    
  122.                         printf("middle down: %d\n", event_mouse.code);    
  123.   
  124.                 }   
  125.             }     
  126.           
  127.         }         
  128.     
  129.     }      
  130.     close(fd);    
  131.     close(fd_kb);   
  132.     close(fd_mouse);      
  133.     return 0;      
  134. }   
  135.   
  136.   
  137.   
  138.   
  139.     
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
el-select组件在输入时无法直接使用@keyup和@keydown来监听键盘事件。但可以通过以下方法来实现键盘事件的监听: 1. 在el-select组件上添加allow-create属性,并设置为true,这样可以允许用户输入自定义的选项。 2. 在el-select组件内部添加el-option组件,设置label和value属性,用于显示和存储选项的值。 3. 在el-select组件上添加@change事件监听器,当选项发生改变时触发。 4. 在change事件处理方法中,可以通过this.$refs.select.selectedLabel来获取当前输入的值。 示例代码如下: ``` <el-select v-model="value" allow-create @change="handleInputChange"> <el-option label="张三" value="1">张三</el-option> </el-select> ``` 在methods中定义handleInputChange方法来处理输入事件: ``` methods: { handleInputChange() { const inputValue = this.$refs.select.selectedLabel; // 处理输入事件的逻辑 } } ``` 通过以上方法,你可以在el-select组件中监听键盘事件,并在handleInputChange方法中处理输入事件的逻辑。 #### 引用[.reference_title] - *1* *2* *3* [关于el-select allow-create输入时按tab或者直接点击文本值会消失的问题(记录](https://blog.csdn.net/u012930947/article/details/120328830)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值