关于linux捕捉鼠标事件的方法

网上找了很多方法,都比较杂乱。这篇文章专注于读取鼠标的动作:左键、右键、中键、滚轮。

linux的设备都以文件形式存放,要读取鼠标,有两种方法,一种是通过/dev/input/mice,一种是通过/dev/input/eventx (x是标号,0,1,2..... 具体的进这个文件夹查看)。两种方式各有优劣,后面讲。

我们先从简单的开始 读取/dev/input/mice获取鼠标事件。

 一般的Linux系统无论鼠标是否连接,mice文件都会存在。读取操作非常简单

读取流程:

1.使用open()函数打开该文件

2.read函数读取该文件

3.在while循环中轮询并打印事件

下面看看代码:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>int main(int argc, char** argv)
{int fd, bytes;char data[3];const char *pDevice = "/dev/input/mice";// Open Mousefd = open(pDevice, O_RDWR);if(fd == -1){printf("ERROR Opening %s\n", pDevice);return -1;}int left, middle, right;signed char x, y;while(1){// Read Mouse     bytes = read(fd, data, sizeof(data));if(bytes > 0){left = data[0] & 0x1; right = data[0] & 0x2;middle = data[0] & 0x4;x = data[1];y = data[2];printf("x=%d, y=%d, left=%d, middle=%d, right=%d\n", x, y, left, middle, right);}   }return 0; 
}

从mice文件中读取三个字节数据,data[0]内含按键信息,最低位为1时代表左键按下即xxxx xxx1时左键按下。以此类推,最后三位分别代表左键、右键、中键。 data[1]、data[2]代表x与y的相对坐标,即本次鼠标移动与上次鼠标移动了多少坐标,向左则x为负,向下则y为负。

到这里通过mice文件获取鼠标事件就已经结束了,肯定有人会问,滚轮呢?

读取mice文件很简单,但它的缺点就是不包含滚轮信息。

使用event文件获取鼠标事件。

首先使用

sudo cat /dev/input/eventx

然后移动鼠标,如果出现输出则可以确定鼠标对应的event文件

我的设备对应event6

在linux/input.h文件内定义了输入事件结构体,根据该结构体来获取信息

输入事件的结构体:

struct input_event {struct timeval time;  //按键时间__u16 type;  //事件的类型__u16 code;  //要模拟成什么按键__s32 value;  //是按下1还是释放0};

type:事件的类型

EV_KEY, 按键事件)鼠标的左键右键等;

EV_REL, 相对坐标

EV_ABS, 绝对坐标

code 事件代码

主要是一些宏定义,具体可查看input.h内文件,如何使用请参考下面的代码

value:事件的值

如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_ REL,value的正数值和负数值分别代表两个不同方向的值。例如:如果code是REL_X,value是10的话,就表示鼠标相对于上一次的坐标,往x轴向右移动10个像素点。

代码如下:

#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <linux/input.h>int main(int argc, char** argv){int fd, bytes;struct input_event event;char data[3];const char *pDevice = "/dev/input/event6";// Open Mousefd = open(pDevice, O_RDWR);if(fd == -1){printf("ERROR Opening %s\n", pDevice);return -1;}while(1){// Read Mouse     bytes = read(fd, &event, sizeof(struct input_event));if(event.type == EV_KEY){switch(event.code){case BTN_LEFT: printf("left:%d\n", event.value);break;case BTN_RIGHT: printf("right:%d\n",event.value);break;case BTN_MIDDLE: printf("middle:%d\n",event.value);break;}}if(event.type == EV_ABS){switch(event.code){case ABS_X: printf("x:%d\n",event.value);break; case ABS_Y: printf("y:%d\n",event.value);break;			}}if(event.type == EV_REL){switch(event.code){			case REL_WHEEL: printf("wheel:%d\n", event.value);break; //滚轮}}}return 0; }

这里我的鼠标不支持读取相对坐标,因此鼠标只读取绝对坐标,注意滚轮事件属于相对事件。

参考:linux - How do you read the mouse button state from /dev/input/mice? - Stack Overflow

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索线程安全:HashMap 的四种使用技巧

这篇文章&#xff0c;我们聊聊线程安全使用 HashMap 的四种技巧。 1 方法内部&#xff1a;每个线程使用单独的 HashMap 如下图&#xff0c;tomcat 接收到到请求后&#xff0c;依次调用控制器 Controller、服务层 Service 、数据库访问层的相关方法。 每次访问服务层方法 serv…

vue H5页面video 视频流自动播放, 解决ios不能自动播放问题

视频组件 <videostyle"width: 100%; height: 100%;object-fit: fill"class"player"refplayer_big_boxcontrolspreloadautoplay //自动播放muted //是否静音playsinline"true"x5-playsinline""webkit-playsinline"tru…

[Linux安全运维] Linux用户以及权限管理

Linux用户以及权限管理 Linux用户和组 用户信息文件pasawd /etc/passwd文件用于存储用户的信息 :用于分割不同的字段信息 字段示例&#xff08;第一行&#xff09;含义说明1root用户名2x密码占位符x代表用户有密码存储在shadow文件中无内容代表用户登录系统不需要密码30UID…

梧桐数据库:存算分离和存算一体架构的分布式数据库技术分析

摘要&#xff1a; 随着数据量的不断增长和对数据处理性能的要求越来越高&#xff0c;分布式数据库技术成为了数据存储和处理的重要解决方案。存算分离和存算一体是两种常见的分布式数据库架构&#xff0c;它们在数据存储和计算方面有着不同的特点和优势。本文将对存算分离和存算…

Spring源码(一) 如何阅读 Spring 源码

学习 Spring 的源码&#xff0c;也可以通过 SpringBoot 搭环境。 不管是什么源码&#xff0c;最好写个 demo&#xff0c;跑起来&#xff0c;然后从常用的类和方法入手&#xff0c;跟踪调试。 配置对象 新建一个 SpringBoot 的项目&#xff0c; 详情见&#xff1a; https://b…

FreeRTOS 中 vListInsertEnd 函数详解

在 FreeRTOS 中&#xff0c;vListInsertEnd 函数用于将新项插入到指定列表的尾部&#xff08;但实际行为是插入到一个特定的索引位置之前&#xff09;。FreeRTOS 使用双向链表&#xff08;doubly linked list&#xff09;来管理任务和其他系统对象&#xff0c;这样可以高效地插…

前端三件套开发模版——产品介绍页面

今天有空&#xff0c;使用前端三件套html、css、js制作了一个非常简单的产品制作页面&#xff0c;与大家分享&#xff0c;希望可以满足大家应急的需求。本页面可以对产品进行“抢购”、对产品进行介绍&#xff0c;同时可以安排一张产品的高清大图&#xff0c;我也加入了页面的背…

JAVA实现二分查找,斐波那契数列,深度优先搜索详情教程【包含代码】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

react+ts+antd项目搭建

前言&#xff1a; 基于ts语言创建react项目&#xff0c;node版本是v16.14.2 一、 脚手架创建项目 全局安装 npm install -g creacte-react-app创建项目file-management&#xff0c;ts需要添加–template typescript npx create-react-app file-management --template typesc…

Ubuntu查看opencv版本c++

✗命令行中直接输入&#xff1a; pkg-config --modversion opencv✔命令行中直接输入&#xff1a; pkg-config --modversion opencv4注解&#xff1a;附上在markdown中打勾&#xff0c;对号和打叉。使用时将&和#之间的空格去掉&#xff0c;这里只是为了不让CSDN自动转换才…

Ubuntu20.04 c++程序 涉及opencv问题记录

头文件更改 默认的头文件引用是 #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp>但是在ubuntu20中/usr/include中默认的是opencv4&#xff0c;他文件夹里面才是opencv2&#xff0c;需要…

vue3单个页面进行防抖节流

防抖 <template><button id"submitButton" ref"submitButton">GET</button> </template><script lang"ts" setup> import { ref, onMounted } from vue;// 防抖函数 function debounce(func: () > void, dela…

【mybatis】mybatis-plus中Wrapper(查询条件构造器)简介_常用方法

1、简介 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyBatis-Plus 提供了强大的条件构造器&#xff08;Wrapper&#xff09;&#xff0c;用于构建复杂的 SQL 查询条件&#xff0c;使得我们…

沟通方法和技巧

0 Preface/Foreword 1 沟通对象 沟通维度&#xff1a; upward&#xff0c;向上沟通&#xff0c;直接上级downward&#xff0c;向下沟通&#xff0c;直接下级horizontal&#xff0c;横向沟通&#xff0c;同部门/跨部门同事 2 沟通方式&#xff08;5W2H&#xff09; 对于开会和…

小白尝试某程机票信息爬取

实训课需要机票数据集&#xff0c;网上没有&#xff0c;所以我选择爬取数据 此过程可谓经历的九九八十一难&#xff0c;也参考了不少大佬的文章&#xff0c;在此特别记录一下 弯路不多说&#xff0c;我直接讲成功的方法 找到请求url 通过控制台&#xff0c;最后确认下面的 …

在WordPress中获取10天之内的文章更新数

要在WordPress中获取10天之内的文章更新数&#xff0c;您可以使用以下代码片段。这段代码将显示在过去10天内更新的文章数量。 <?php // 获取当前时间戳 $now time();// 计算10天前的时间戳 $ten_days_ago $now - (10 * 24 * 60 * 60);// 设置查询参数 $args array(pos…

【Spring Boot AOP中切入表达式格式介绍】

文章目录 一、切入表达式简介二、切入表达式的语法1. 方法匹配符示例&#xff1a; 2. 类型匹配符示例&#xff1a; 一、切入表达式简介 切入表达式&#xff08;Pointcut Expression&#xff09;是AOP中定义切入点&#xff08;Pointcut&#xff09;的一种方式。它定义了在哪些连…

基于Java中的SSM框架实现物流管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现物流管理系统演示 摘要 企业的发展离不开物流的运输&#xff0c;在一个大型的企业中&#xff0c;商品的生产和建设&#xff0c;推广只是前期的一些工作&#xff0c;在后期的商品销售和物流方面的建立&#xff0c;才能让一个企业得到大力的发展。 企业…

基于Linux/ARM/单片机利用状态机对多个按键进行扫描实现短按或者长按

1&#xff09;Linux/ARM/单片机入门级按键扫描程序设计&#xff0c;分享给将要学习或者正在学习Linux/ARM/单片机开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 学习Linux/ARM/单片机的同学…

docker部署简单的Kafka

文章目录 1. 拉取镜像2. 运行创建网络运行 ZooKeeper 容器运行 Kafka 容器 3. 简单的校验1. 检查容器状态2. 检查 ZooKeeper 日志3. 检查 Kafka 日志4. 使用 Kafka 命令行工具检查5. 创建和删除测试主题 1. 拉取镜像 选择一组兼容性好的版本。 docker pull bitnami/kafka:3.6…