鼠标事件
- EV_REL(相对坐标)
- EV_KEY(按键)
EV_REL用来表示鼠标在屏幕的位置,EV_KEY用来表示鼠标的按钮。
EV_REL类型(相对坐标)
如果事件是相对坐标时,读取到的struct input_event的type字段的值为 2 (EV_REL) ,code字段的取值可能是REL_X(相对坐标X值)、REL_X(相对坐标Y值)、REL_WHEEL(滚轮),value字段根据code的取值不同而不同,可以表示坐标(X值、Y值),滚轮上滑(-1)、下滑(1)
EV_KEY类型(按键:左键、右键、滚轮键)
鼠标事件有四种按键类型,分别表示左键、右键、滚轮键按下/抬起,读取到的struct input_event的type字段的值为 1 (EV_KEY) ,code字段取值可能是BTN_LEFT(左键)、BTN_RIGHT(右键)、BTN_MIDDLE(滚轮键),value字段一般是 1 表示按下,0 表示抬起,
Code
cpp
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <string.h>
#include <linux/input.h>
int judge_sta(int code, int value)//判断按键类型
{
switch (code)
{
case BTN_LEFT:
if(value == 0)
return 0;
else
return 1;
break;
case BTN_RIGHT:
if(value == 0)
return 2;
else
return 3;
break;
case BTN_MIDDLE:
if(value == 0)
return 4;
else
return 5;
break;
default:
return -1;
break;
}
}
int main(int argc, char* argv[])
{
int fd = open(argv[1], O_RDONLY);
struct input_event in_ev;
int valid = 0;
int down = -1;
int x = 0, y = 0;
int flag = 0;
for( ; ; )
{
if (sizeof(struct input_event) == read(fd, &in_ev, sizeof(struct input_event)))
{
switch (in_ev.type)
{
case EV_KEY:
down = judge_sta(in_ev.code, in_ev.value);
valid = 1;
break;
case EV_REL:
switch (in_ev.code) {
case REL_X: //X坐标
x = in_ev.value;
valid = 1;
break;
case REL_Y: //Y坐标
y = in_ev.value;
valid = 1;
break;
case REL_WHEEL://滚轮上下滑动事件
if(in_ev.value == -1)
down = 6;
else
down = 7;
valid = 1;
}
case EV_SYN:
if(in_ev.code == SYN_REPORT)
{
if(valid == 1)
{
switch (down) {//判断状态
case 0:
printf("左键松开\n");
break;
case 1:
printf("左键按下(%d, %d)\n", x, y);
break;
case 2:
printf("右键松开\n");
break;
case 3:
printf("右键按下(%d, %d)\n", x, y);
break;
case 4:
printf("滚轮松开\n");
break;
case 5:
printf("滚轮按下(%d, %d)\n", x, y);
break;
case 6:
printf("滚轮下滑\n");
break;
case 7:
printf("滚轮上滑\n");
break;
case -1:
printf("移动(%d, %d)\n", x, y);
break;
}
valid = 0;
down = -1;
flag = 0;
}
}
break;
default:
break;
}
}
}
close(fd);
return 0;
}