關于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.pswp.cn/diannao/40335.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40335.shtml
英文地址,請注明出處:http://en.pswp.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…