Linux之解析鼠标input事件数据(有BUG,已经解决)

在这里我说两句废话,在写代码的过程中遇到问题一定要去仔细分析问题所在,遇到问题是好事,解决问题说明你在成长。写这篇文章的原因是我发现网上对鼠标数据解析类的文章非常少,还有个现象是很多网友喜欢大量copy别人的博文,然后不加验证就发表出来,别人错误的代码你也跟着错误,至少得自己验证过后是正确的在发表吧。

上代码之前补充几点知识,也是我在解析鼠标数据时候犯下的错误:

当我们写好鼠标驱动程序后,我们测试利用的是cat  /dev/event0   或者hexdump    /dev/event0

这是Input输入事件的上报事件的格式

struct timeval {
__kernel_time_ttv_sec;
/* seconds */
__kernel_suseconds_ttv_usec;
/* microseconds */
};

/*
 * The event structure itself
 */

struct input_event {
struct timeval time;          /* 固定格式,一定要理解了 */
__u16 type;
__u16 code;
__s32 value;
};

这是hexdump /dev/event0  后的数据:(非常重要的知识点)

                       秒        微秒      类           code    value
0000000 0bb2 0000 0e48 000c 0001 0026 0001 0000            
0000010 0bb2 0000 0e54 000c 0000 0000 0000 0000
0000020 0bb2 0000 5815 000e 0001 0026 0000 0000
0000030 0bb2 0000 581f 000e 0000 0000 0000 0000  

/* 第一个字符串代表系统时间,无影响,第二和第三个字符串代表秒,第四和第五个字符串代表微妙,依次是类,类下面的那种事件,最后32位是具体值,从上面结构体我们是可以看出来的,这里要注意我们读取数据时候第一个字符串是不会读取的,我就犯了第一个错误,第二个错误我们读取数据应该从右往左读数,这满足于小端模式*/

现在开始上代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

/*
  *mouse_test
  */

struct input_event1 {    /* 时间没有用到,我们读取时间不是这个的范围 */
unsigned short type;
unsigned short code;
unsigned  int value;
};

 struct input_event1  input_mouse;
/* 字符串的格式是:       
      秒            微秒          类     code     value
0000000   0bb2 0000 0e48 000c    0001   0026   0001 0000 
这里要注意前面那一个字符串是系统时间,这里我们没有读取,我们只需要读取类,code,value
*/

int main(int argc, char **argv)
{
int fd;
unsigned char key_val[16];

fd = open("/dev/event0", O_RDWR);
if (fd < 0)
{
printf("can't open /dev/event0\n");
}

while(1)
{
   printf(" this is bug \n");  /* 这里遇到一个BUG,添加这条语句,下面的printf才会执行,不添加就不会执行 ,折腾两个小时才发现这个BUG,望大牛指点一下为什么,小弟感激不尽。*/
   read(fd, key_val,16);   /* 把数据全部读取到key_val数组中 */

input_mouse.type=(key_val[9]<<8 | key_val[8]);
   /* 处理数据,把数据放在上面定义的结构体中 */
 input_mouse.code=((key_val[11]<<8)|key_val[10]);

input_mouse.value=((key_val[13]<<24)|(key_val[12]<<16)|(key_val[15]<<8)|key_val[14]);
     
   printf("%04x  ",input_mouse.type);
   printf("%04x  ",input_mouse.code);
   printf("%04x  ",input_mouse.value);
}
return 0;
}

时间: 2024-09-12 16:07:39

Linux之解析鼠标input事件数据(有BUG,已经解决)的相关文章

linux 下 mysql下保存进去数据为乱码的解决办法(centos5.x)

linux mysql中文乱码 CENTOS 5.4/3 上适用[转] 2011-01-17 09:31 mysql默认的字符编码是latin1,而我用的是utf-8,存入数据库就变成了?????这样的乱码,解决方法: 1.windows下:修改my.ini文件,有两处default-character-set=latin1都改为default-character-set=utf8重启既可. 2.linux下:vi /etc/my.cnf(# cp /usr/share/mysql/my-med

手把手教你写Linux设备驱动---input子系统(一)--input事件应用程序的读写实现(基于友善之臂4412开发板)

     这节,我们来说下input子系统,什么是input子系统? input子系统就是输入子系统.      输入子系统是 Linux内核用于管理各种输入设备 (键盘,鼠标,遥控杆,书写板等等 )的部分,用户通过输入子系统进行内核,命令行,图形接口之间的交换.输入子系统在内核里实现,因为设备经常要通过特定的硬件接口被访问 (例如串口, ps/2, usb等等 ),这些硬件接口由内核保护和管理.内核给用户导出一套固定的硬件无关的 input API,供用户空间程序使用. 输入子系统分为三块:

Linux 模拟 鼠标 键盘 事件

/************************************************************************ * Linux 模拟 鼠标 键盘 事件 * 说明: * 以前看到有些软件能够控制鼠标移动,键盘操作等功能,总想知道这些到底 * 是怎么做到的,好像是2年前也尝试去做这件事,但那时候对知识的匮乏直接导致 * 无法进行,早上突然想到这件事,于是又搜索了一下,鉴于目前经常接触Linux * 驱动,对这些东西的理解也就很容易. * * 2016-2-27 深

easyui load的数据如何取消鼠标进入事件和鼠标点击事件造成的样式变化

问题描述 easyui load的数据如何取消鼠标进入事件和鼠标点击事件造成的样式变化 table通过easyui的loadData方法后,数据处的两个样式变化,一个是鼠标进入一行, 这行全部的背景色都改变为浅蓝色,如果点击这行,这行会被选中,可以通过getSelect 取到这行,这行的背景色变为黄色, 我想取消掉这两个事件,让数据就像是普通的table一样 求助 解决方案 用rowStyler配置背景色覆盖添加的样式即可.. <table id="dg" class="

解析javascript中鼠标滚轮事件

  这篇文章主要给大家详细介绍了javascript中鼠标滚轮事件,图文并茂,十分的详细,有需要的小伙伴可以参考下. 所有的现代浏览器都支持鼠标滚轮,并且在用户滚动滚轮时触发时间.浏览器通常使用鼠标滚轮滚动或缩放文档,但可以通过取消mousewheel事件来阻止这些默认操作.有一些互用性问题影响滚轮事件,但是编写跨平台的代码依旧可以行.除了Firefox之外的所有浏览器都支持"mousewheel"事件,但Firefox使用"DOMMouseScroll",而3级D

解析javascript中鼠标滚轮事件_javascript技巧

所有的现代浏览器都支持鼠标滚轮,并且在用户滚动滚轮时触发时间.浏览器通常使用鼠标滚轮滚动或缩放文档,但可以通过取消mousewheel事件来阻止这些默认操作.有一些互用性问题影响滚轮事件,但是编写跨平台的代码依旧可以行.除了Firefox之外的所有浏览器都支持"mousewheel"事件,但Firefox使用"DOMMouseScroll",而3级DOM事件规范草案建议使用事件名"wheel"替代"mousewheel". d

html中鼠标滚轮事件onmousewheel的处理方法_javascript技巧

滚轮事件是不同浏览器会有一点点区别,一个像Firefox使用DOMMouseScroll ,ff也可以使用addEventListener方法绑定DomMouseScroll事件,其他的浏览器滚轮事件使用mousewheel,下面我来给大家具体介绍. Firefox使用DOMMouseScroll,其他的浏览器使用mousewheel.滚动事件触发时Firefox使用detail属性捕捉滚轮信息,其他的浏览器使用wheelDelta.不知道为何在该问题上其他厂商和微软的如此一致.Firefox可

SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的_jquery

json作为一种轻量级的数据交换格式,在前后台数据交换中占据着非常重要的地位.Json的语法非常简单,采用的是键值对表示形式.JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序,也可以从服务器端程序传递json格式的字符串给前端并由前端解释.这个字符串是符合json语法的,而json语法又是 javascript语法的子集,所以javascript很容易解释它,而且

js鼠标单击和双击事件冲突问题的快速解决方法_javascript技巧

情况一 如果在一个DOM对象上同时绑定单击(click)和双击(dblclick)事件,当在这个DOM对象上发生双击事件时,第一次点击(click)会 触发一次单击(click)事件,第二次点击(连续的)也会触发双击(dblclick)事件,还是会触发单击(click)事件(IE7与 firefox). 解决方法: <button onclick="test(1)" ondblclick="test(2)"></button> <scr