Linux 键盘/鼠标 按键事件 编程
文章目录
- Linux 键盘/鼠标 按键事件 编程
- 1. 头文件
- 2. 以只读方式打开对应的字符设备文件
- 3. 读取文件信息
- 4. 浅析`struct input_event`结构体各成员值
- 按键`code`
- 5. 轮询检测
- 6. 示例
- 7. 补充
Linux 键盘/鼠标 按键事件 编程
从键盘对应的字符设备文件中直接读取数据,获取键盘信息时不需要通过回车就能操作,键盘所对应的字符设备文件在/dev/input
目录下的event0-4
中的某一个,可以自己先测试到底是哪一个
如何测试?
- 先在终端进入到对应目录下,
cd /dev/input/
- 然后依次检测文件信息,使用
sudo cat event1
命令检测- 执行命令后会阻塞等待,当有按键按下时,会出现咱看不懂的二进制字符,如下
- 如果没有出现这些奇怪的东西,而是显示对应敲下的字母,就说明不是这个文件。
鼠标事件
测试了一下鼠标事件,发现在mouse0
文件下可以检测到鼠标,但是读出来的事件信息都是完全一样的。
于是,又测试了event2
文件,发现也可以检测到鼠标事件,虽然滚轮上下滑动检测不到,但是鼠标移动、左键单击、右键单击和中间单击都可用输入事件结构体读取分辨出来。
1. 头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
2. 以只读方式打开对应的字符设备文件
int fd;if((fd = open("/dev/input/event1", O_RDONLY)) == -1){perror("open error");return -1;}
3. 读取文件信息
使用输入事件结构体strcut input_event
,定义一个该结构体的变量,来接收输入事件信息。接收信息使用read()
函数,将按键事件写入结构体即可。
struct input_event { struct timeval time; // 保存输入类型,其中 EV_KEY 表示键盘,宏定义的数字是 0x01__u16 type; // 保存键盘输入字符的编号,每个编号对应一个值__u16 code; // 保存按键当前的状态值// 1 按键按下// 2 按键抬起// 3 按键长按__s32 value; 1 按键按下0 按键抬起2 按键常按
};
4. 浅析struct input_event
结构体各成员值
对于键盘
键盘事件 |
type (宏定义 - 数值)
|
code (宏定义 - 数值)
|
value
|
---|---|---|---|
按键按下 |
EV_KEY - 0x1
|
每个键都有对应code
|
0x1
|
按键抬起 |
EV_KEY - 0x1
|
每个键都有对应code
|
0x0
|
按键长按 |
EV_KEY - 0x1
|
每个键都有对应code
|
0x2
|
对于鼠标
鼠标事件 |
type (宏定义 - 数值)
|
code (宏定义 - 数值)
|
value
|
---|---|---|---|
鼠标同步事件 |
EV_SYN - 0x0
|
SYN_REPORT - 0x0
|
0x0
|
鼠标左右移动 |
EV_ABS - 0x3
|
ABS_X - 0x0
|
鼠标坐标 |
鼠标上下移动 |
EV_ABS - 0x3
|
ABS_Y - 0x1
|
鼠标坐标 |
鼠标左键按下 |
EV_KEY - 0x1
|
BTN_LEFT - 0x110
|
0x1
|
鼠标左键抬起 |
EV_KEY - 0x1
|
BTN_LEFT - 0x110
|
0x0
|
鼠标右键按下 |
EV_KEY - 0x1
|
BTN_RIGHT - 0x111
|
0x1
|
鼠标右键抬起 |
EV_KEY - 0x1
|
BTN_RIGHT - 0x111
|
0x0
|
鼠标中键按下 |
EV_KEY - 0x1
|
BTN_MIDDLE - 0x112
|
0x1
|
鼠标中键抬起 |
EV_KEY - 0x1
|
BTN_MIDDLE - 0x112
|
0x0
|
EV_SYN
同步事件
EV_ABS
Absolute axes 绝对轴事件(x, y, z)
因为我们的屏幕是平面显示,所以ABS_Z
用不到。
鼠标每个移动、按下、抬起事件后,都会产生一个同步事件,根据类型的宏定义可以理解为汇报鼠标信息。
特殊的,如果鼠标斜着走,鼠标会同时产生x轴移动和y轴移动两个事件,然后产生同步事件
注:鼠标按键和键盘按键都属于EV_KEY
,也就是按键事件 ,这里把键盘按键分成KEY
,鼠标按键分为BUTTON
,但他们都属于同类型的按键。
到这里,如果要记住键盘,鼠标按键对应的code
非常难,如果每次要用的时候,当场测试也麻烦,所以我们可以用宏定义,就比较方便。如下图,键盘输入我们可以通过KEY_x
来表示,x
表示按下键对应的字符,一般为大写,鼠标可以用BUTTON_xx
,xx
可以用LEFT
z左键、RIGHT
右键、MIDDLE
中键表示。
按键code
5. 轮询检测
while(1){read(fd, &mykey, sizeof(mykey));if(mykey.type == EV_KEY){printf("type:%#x, code:%d, value:%#x\n", mykey.type, mykey.code, mykey.value);if(mykey.value == 1){printf("按键按下了\n");}else if(mykey.value == 0){printf("按键抬起了\n");}else if(mykey.value == 2){printf("按键一直按下\n");}}}return 0;
}
6. 示例
判断wasd是否被按下
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>int main(int argc, char const *argv[])
{//打开设备文件int fd;if((fd = open("/dev/input/event1", O_RDONLY)) == -1){perror("open error");return -1;}//读取文件内容struct input_event mykey;while(1){read(fd, &mykey, sizeof(mykey));if(mykey.type == EV_KEY){//printf("type:%#x, code:%d, value:%#x\n", mykey.type, mykey.code, mykey.value);if(mykey.value == 1){switch (mykey.code){case 17:puts("w键按下了");break;case 30:puts("a键按下了");break;case 31:puts("s键按下了");break;case 32:puts("d键按下了");break;}}}}return 0;
}
7. 补充
事件类型
同步事件
相对轴事件
这个东西,是我通过追EV_KEY
,追到的,只要包含一开始写的头文件,就可以得到,这里本想把这个定义宏定义的文件放进来,但是我还不会传文件,所以找不到的小伙伴,可以点这里下载文件,或者移步ctags使用,学习如何追代码。
Linux 键盘/鼠标 按键事件 编程相关推荐
- JavaScript 键盘的按键事件
一 键盘的按键事件 keydown 按键按下 keyup 按键抬起 keypress 按键按下 1, 键盘事件 默认只有可以获取焦点的标签支持 一般只是input标签 textarea documen ...
- QT Linux平台屏蔽按键事件(installEventFilter使用) 自定义拦截按键输入
文章目录 背景 焦点 focus focusPolicy keypress和keyrelease installEventFilter 重写事件过滤器 过滤组件的按键事件 最终效果 Qt是一个跨平台开 ...
- Qt软键盘-发送按键事件
发送按键事件到当前聚焦的窗体. 1.获取当前聚焦的QWidget QWidget *receiver = QApplication::focusWidget(); qDebug()<<&q ...
- 〖Python WEB 自动化测试实战篇⑦〗- 实战 - selenium的基本元素操作与键盘鼠标模拟事件操作
万叶集
- linux键盘鼠标不能使用的办法
chkconfig --list messagebus chkconfig messagebus on service messagebus start chkconfig --list haldae ...
- DX11(九):处理键盘鼠标输入
06/11/2020 键盘鼠标输入 WIN32 API 输入与输出 DirectXTK keyDown和keyUp函数,不是类的成员函数 键盘鼠标的单例模式 封装好的isKeyDown 和 isKey ...
- Linux 模拟 鼠标 键盘 事件
/************************************************************************* Linux 模拟 鼠标 键盘 事件* 说明:* 以 ...
- linux 鼠标 脚本,linux获得键盘鼠标事件,模拟键盘鼠标按键
linux中键盘鼠标等输入设备通过input子系统实现设备驱动,驱动程序完成向系统报告输入事件,input子系统完成了文件操作接口 linux/input.h定义了输入事件结构体 api 和 按键定义 ...
- linux捕获鼠标点击事件文件,linux获得键盘鼠标事件,模拟键盘鼠标按键
linux中键盘鼠标等输入设备通过input子系统实现设备驱动,驱动程序完成向系统报告输入事件,input子系统完成了文件操作接口 linux/input.h定义了输入事件结构体 api 和 按键定义 ...
最新文章
- 基于朴素贝叶斯的垃圾分类算法(Python实现)
- 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_1_final关键字概念与四种用法...
- mysql的主从复制原理
- 备考信息系统项目管理师5点必过经验
- 阿里云 ecs mysql搭建_使用ECS和mysql搭建mysql服务器-阿里云开发者社区
- 浅析局域网与广域网中数据传输
- F - Good Words
- 【云和恩墨】Oracle初学者入门指南-什么是 Metalink 或 MOS ?
- 7月30日PMP考试注意事项
- 【JAVA面试题整理】框架之Shiro
- 服务器系统 usb不识别u盘,无法识别的usb设备怎么办(实测成功解决U盘修复教程)...
- win10远程桌面查看对方计算机名,教你如何使用Win10远程桌面控制他人电脑?
- 关于打开ARX项目的一些错误
- 豆瓣电影数据分析案例
- css display contents
- c语言 ascii码转成字符串,ASCII码与字符串的相互转换
- 致童年,那些年我们逝去的岁月
- Html网页设计-美食网站
- IT研发人员的四种工作
- 叶念琛告诉你什么是爱情。。。
热门文章
- Android数据库选择恐惧症
- My SQL 安装教程---踩过所有第一次安装会踩的坑
- “对DllRegisterServer的调用失败,错误代码为0×80070005 ”
- 夏普MX-M2658N复印机显示请放入载体组件
- mega-nerf安装流程
- WMS系统后端开发-货位管理
- Docker compose ERROR: for resources Cannot start service xxd: network not found
- 今天,我要挺一把 CSDN!
- Spark机器学习管道 - Pipeline
- Android----一个完整的小项目(医疗app)