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
#include
#include
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);
}