文章目录

  • Linux 键盘/鼠标 按键事件 编程
    • 1. 头文件
    • 2. 以只读方式打开对应的字符设备文件
    • 3. 读取文件信息
    • 4. 浅析`struct input_event`结构体各成员值
      • 按键`code`
    • 5. 轮询检测
    • 6. 示例
    • 7. 补充

Linux 键盘/鼠标 按键事件 编程

从键盘对应的字符设备文件中直接读取数据,获取键盘信息时不需要通过回车就能操作,键盘所对应的字符设备文件在/dev/input目录下的event0-4中的某一个,可以自己先测试到底是哪一个

如何测试?

  1. 先在终端进入到对应目录下,cd /dev/input/
  2. 然后依次检测文件信息,使用 sudo cat event1命令检测
  3. 执行命令后会阻塞等待,当有按键按下时,会出现咱看不懂的二进制字符,如下
  4. 如果没有出现这些奇怪的东西,而是显示对应敲下的字母,就说明不是这个文件。

鼠标事件

测试了一下鼠标事件,发现在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_ABSAbsolute axes 绝对轴事件(x, y, z)
因为我们的屏幕是平面显示,所以ABS_Z用不到。

鼠标每个移动、按下、抬起事件后,都会产生一个同步事件,根据类型的宏定义可以理解为汇报鼠标信息。
特殊的,如果鼠标斜着走,鼠标会同时产生x轴移动和y轴移动两个事件,然后产生同步事件

注:鼠标按键和键盘按键都属于EV_KEY,也就是按键事件 ,这里把键盘按键分成KEY,鼠标按键分为BUTTON,但他们都属于同类型的按键。

到这里,如果要记住键盘,鼠标按键对应的code非常难,如果每次要用的时候,当场测试也麻烦,所以我们可以用宏定义,就比较方便。如下图,键盘输入我们可以通过KEY_x来表示,x表示按下键对应的字符,一般为大写,鼠标可以用BUTTON_xxxx可以用LEFTz左键、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 键盘/鼠标 按键事件 编程相关推荐

  1. JavaScript 键盘的按键事件

    一 键盘的按键事件 keydown 按键按下 keyup 按键抬起 keypress 按键按下 1, 键盘事件 默认只有可以获取焦点的标签支持 一般只是input标签 textarea documen ...

  2. QT Linux平台屏蔽按键事件(installEventFilter使用) 自定义拦截按键输入

    文章目录 背景 焦点 focus focusPolicy keypress和keyrelease installEventFilter 重写事件过滤器 过滤组件的按键事件 最终效果 Qt是一个跨平台开 ...

  3. Qt软键盘-发送按键事件

    发送按键事件到当前聚焦的窗体. 1.获取当前聚焦的QWidget QWidget *receiver = QApplication::focusWidget(); qDebug()<<&q ...

  4. 〖Python WEB 自动化测试实战篇⑦〗- 实战 - selenium的基本元素操作与键盘鼠标模拟事件操作

    万叶集

  5. linux键盘鼠标不能使用的办法

    chkconfig --list messagebus chkconfig messagebus on service messagebus start chkconfig --list haldae ...

  6. DX11(九):处理键盘鼠标输入

    06/11/2020 键盘鼠标输入 WIN32 API 输入与输出 DirectXTK keyDown和keyUp函数,不是类的成员函数 键盘鼠标的单例模式 封装好的isKeyDown 和 isKey ...

  7. Linux 模拟 鼠标 键盘 事件

    /************************************************************************* Linux 模拟 鼠标 键盘 事件* 说明:* 以 ...

  8. linux 鼠标 脚本,linux获得键盘鼠标事件,模拟键盘鼠标按键

    linux中键盘鼠标等输入设备通过input子系统实现设备驱动,驱动程序完成向系统报告输入事件,input子系统完成了文件操作接口 linux/input.h定义了输入事件结构体 api 和 按键定义 ...

  9. linux捕获鼠标点击事件文件,linux获得键盘鼠标事件,模拟键盘鼠标按键

    linux中键盘鼠标等输入设备通过input子系统实现设备驱动,驱动程序完成向系统报告输入事件,input子系统完成了文件操作接口 linux/input.h定义了输入事件结构体 api 和 按键定义 ...

最新文章

  1. 基于朴素贝叶斯的垃圾分类算法(Python实现)
  2. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第5节 final关键字_1_final关键字概念与四种用法...
  3. mysql的主从复制原理
  4. 备考信息系统项目管理师5点必过经验
  5. 阿里云 ecs mysql搭建_使用ECS和mysql搭建mysql服务器-阿里云开发者社区
  6. 浅析局域网与广域网中数据传输
  7. F - Good Words
  8. 【云和恩墨】Oracle初学者入门指南-什么是 Metalink 或 MOS ?
  9. 7月30日PMP考试注意事项
  10. 【JAVA面试题整理】框架之Shiro
  11. 服务器系统 usb不识别u盘,无法识别的usb设备怎么办(实测成功解决U盘修复教程)...
  12. win10远程桌面查看对方计算机名,教你如何使用Win10远程桌面控制他人电脑?
  13. 关于打开ARX项目的一些错误
  14. 豆瓣电影数据分析案例
  15. css display contents
  16. c语言 ascii码转成字符串,ASCII码与字符串的相互转换
  17. 致童年,那些年我们逝去的岁月
  18. Html网页设计-美食网站
  19. IT研发人员的四种工作
  20. 叶念琛告诉你什么是爱情。。。

热门文章

  1. Android数据库选择恐惧症
  2. My SQL 安装教程---踩过所有第一次安装会踩的坑
  3. “对DllRegisterServer的调用失败,错误代码为0×80070005 ”
  4. 夏普MX-M2658N复印机显示请放入载体组件
  5. mega-nerf安装流程
  6. WMS系统后端开发-货位管理
  7. Docker compose ERROR: for resources Cannot start service xxd: network not found
  8. 今天,我要挺一把 CSDN!
  9. Spark机器学习管道 - Pipeline
  10. Android----一个完整的小项目(医疗app)