linux系统取得鼠标按下抬起事件

linux系统取得鼠标按下抬起事件

一、原理

读取linux的输入设备的设备文件,通过解析设备文件的内容,判断当前鼠标是压下还是抬起操作。

二、实现方法/步骤

1、确定鼠标对应的设备文件

鼠标的设备文件一般保存在/dev/input/eventX中,究竟是哪一个“event”,不同的PC机是有差别的,如图:我的PC中有5个event设备文件

 

可以通过cat命令进行测试,在命令行窗口输入:cat /dev/input/event2。

 

命令执行后,如果鼠标按下或者移动的时候,屏幕有数据输出,则证明鼠标使用的就是这个设备文件,否则换一个继续试试,直到找到正确的设备文件。

2、打开设备文件

int keys_fd;

keys_fd = open ("/dev/input/event2", O_RDONLY);

3、读取设备文件

struct input_event t;

read (keys_fd, &t, sizeof(t))

数据保存在结构体变量t中

4、解析设备文件

首先根据设备文件的type和code确定设备是鼠标,然后根据value的值确定是压下还是抬起动作。

5、关闭设备文件

close (keys_fd);

 

三、linux的input_event结构体说明

input_event结构体在linux/input.h中有定义,结构体定义如下:

struct input_event {
struct timeval time; /* 按键时间 */
__u16 type;          /* 类型,在下面有定义 */
__u16 code;          /* 按键名称 */
__s32 value;         /* 是按下还是抬起 */

};

struct timeval

{

__time_t tv_sec;        /* Seconds */

__suseconds_t tv_usec;  /* Micro seconds */

};

成员详细说明:

Time:按键时间

tv_sec为从计算机的元年开始到创建struct timeval时的秒数,tv_usec为微秒数,即秒后面的零头。比如当前tv_sec为1596095000,tv_usec为128888,即当前时间距计算机的元年时间为1596095000秒,128888微秒。

type:事件的类型 
EV_KEY,键盘
EV_REL,相对坐标
EV_ABS,绝对坐标

code:事件的代码

如果事件的类型代码是EV_KEY,该代码code为设备键盘代码。代码值0~127为键盘上的按

键代码,0x110~0x116 为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看include/linux/input.h。

value:事件的值

如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0。

小知识:

1970.1.1是个神马特殊的日子?原来,1970.1.1是被看作计算机的元年,最早出现的UNIX

操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME

的纪元时间(开始时间),而java、数据库、许多精密的仪器等也自然也遵循了这一约束。

四、功能实现的参考代码

#include <unistd.h>

#include <fcntl.h>

#include <linux/input.h>

 

void mouseDownUpEvent()

{

    int keys_fd;

    struct input_event t;

    int  mm = 0;

 

    /* 打开设备文件,文件路径为/dev/input/event2 */

    keys_fd = open ("/dev/input/event2", O_RDONLY);

    if (keys_fd < 0)

    {

        qDebug ("open /dev/input/event3 device error!\n");

    }

 

    while(1)

    {

        if(mm < 8)

        {

            if (read (keys_fd, &t, sizeof(t)))

            {

                /* 鼠标左键按下和抬起操作 */

                /* EV_KEY表示鼠标或者键盘设备,code为0x110表示鼠标左键 */

                if ((EV_KEY == t.type)&&(0x110 == t.code))

                {

                    mm++;

                    qDebug()<<" t.value:"<< t.value;

                    qDebug()<<" t.code:"<< t.code;

                    /* value的值为1表示压下,0表示抬起 */

                    if (0 == t.value)

                    {

                        qDebug()<<"left Released";

                    }else if(1 == t.value){

                        qDebug()<<"left Pressed";

                    }

                }

                /* 鼠标右键按下和抬起操作 */

                /* code为0x111表示鼠标右键 */

                if ((EV_KEY == t.type)&&(0x111 == t.code))

                {

                    mm++;

                    qDebug()<<" t.value:"<< t.value;

                    qDebug()<<" t.code:"<< t.code;

                    if (0 == t.value)

                    {

                        qDebug()<<"right Released";

                    }else if(1 == t.value){

                        qDebug()<<"right Pressed";

                    }

                }

            }

        }else

        {

            break;

        }

    }

    close (keys_fd);

}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值