我正在使用这段代码在Linux中读取/dev/input/event*中的鼠标事件。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/input.h>
#include <fcntl.h>
#define MOUSEFILE "/dev/input/event4"
int main()
{
int fd;
struct input_event ie;
if((fd = open(MOUSEFILE, O_RDONLY)) == -1) {
perror("opening device");
exit(EXIT_FAILURE);
}
while(read(fd, &ie, sizeof(struct input_event))) {
printf("time %ld.%06ld\ttype %d\tcode %d\tvalue %d\n",
ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value);
}
return 0;
}
它以以下格式给出结果:
time 1342517261.840285 type 2 code 0 value -1
'time'是时间戳,返回事件发生的时间。
'code'是事件代码,例如REL_X或KEY_BACKSPACE,在include/linux/input.h中完整列表。
'value'是事件携带的值。对于EV_REL,它是相对变化量;对于EV_ABS(如操纵杆),它是绝对新值;对于EV_KEY,它为0表示释放,1表示按下,2表示自动重复。
当我点击时,我可以获得事件,但无法获得鼠标在屏幕上的位置,有什么方法可以获取鼠标在屏幕上的位置。
编辑1:事实证明我必须使用相对坐标来获得鼠标坐标。我认为这是一个常见的需求,因此可能有库/现有代码可用于获取坐标。任何关于此主题的信息都将非常有用。
编辑2:解决方案
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/input.h>
#include <fcntl.h>
#include <X11/Xlib.h>
#define MOUSEFILE "/dev/input/event4"
int main()
{
int fd;
struct input_event ie;
Display *dpy;
Window root, child;
int rootX, rootY, winX, winY;
unsigned int mask;
dpy = XOpenDisplay(NULL);
XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child,
&rootX,&rootY,&winX,&winY,&mask);
if((fd = open(MOUSEFILE, O_RDONLY)) == -1) {
perror("opening device");
exit(EXIT_FAILURE);
}
while(read(fd, &ie, sizeof(struct input_event))) {
if (ie.type == 2) {
if (ie.code == 0) {
XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child,
&rootX,&rootY,&winX,&winY,&mask);
//rootX += ie.value;
}
else if (ie.code == 1) {
XQueryPointer(dpy,DefaultRootWindow(dpy),&root,&child,
&rootX,&rootY,&winX,&winY,&mask);
// rootY += ie.value;
}
printf("time%ld.%06ld\tx %d\ty %d\n",
ie.time.tv_sec, ie.time.tv_usec, rootX, rootY);
} else
printf("time %ld.%06ld\ttype %d\tcode %d\tvalue %d\n",
ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value);
}
return 0;
}
XQueryPointer看起来是更方便的解决方案。 感谢@perreal的指导。
gcc main.c -lX11
。 - perreal