通过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
- 通过select较高效的捕获和处理鼠标键盘事件
- 通过select较高效的捕获和处理鼠标键盘事件
- 鼠标和键盘的事件捕获增强
- VB 捕获 WebBrowser控件的鼠标和键盘事件
- 鼠标和键盘处理事件
- 捕获鼠标和键盘的原始数据
- Qml实现对鼠标和键盘事件的简单处理
- .NET使用钩子捕获全局鼠标和键盘事件
- C#处理鼠标和键盘事件
- C#处理鼠标和键盘事件
- C#处理鼠标和键盘事件
- C#处理鼠标和键盘事件
- C#处理鼠标和键盘事件
- C#处理鼠标和键盘事件
- C#处理鼠标和键盘事件
- C#处理鼠标和键盘事件
- C#处理鼠标和键盘事件
- C#处理鼠标和键盘事件
- Unity3D优化学习记录
- BIOS工程师第一课 DXE Dispatcher 源代码分析
- 数据库表的垂直拆分和水平拆分
- Android开发环境搭建【详细教程】
- 解决Android Fragment 无法相应 onActivityResult 的问题.
- 通过select较高效的捕获和处理鼠标键盘事件
- 连接数据库
- Android ZIP文件提取classes.dex文件签名校验绕过漏洞
- JDBC
- linux编译!
- eclipse svn时忽略target .project .classpath等目录文件
- PHP下利用PHPMailer配合QQ邮箱下的域名邮箱发送邮件
- 深入剖析Auto Layout,分析iOS各版本新增特性
- matlab生成dll