如何阅读低级别的鼠标在Linux中的位置。

我正在使用这段代码从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; } 

它给了我格式的结果:

时间1342517261.840285types2代码0值-1

“时间”是时间戳,它返回事件发生的时间。

'code'是事件代码,例如REL_X或KEY_BACKSPACE,完整列表在include / linux / input.h中。

“价值”是事件的价值。 EV_REL的相对变化,EV_ABS的绝对新值(操纵杆…),或者EV_KEY的释放为0,按键为1,自动重复为2。

当我点击,我得到的事件,但我没有得到在屏幕上的鼠标的位置,是什么方式来获得在屏幕上的鼠标的位置。


编辑1:所以事实certificate,我必须使用相对坐标来获得鼠标坐标。我相信这是一个共同的要求,所以可能有库/预先存在的代码,你可以用来获得坐标。 任何关于这个主题的信息将是非常有用的。


编辑2:解决scheme

 #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似乎更方便的解决scheme。 感谢@perreal的指导。

您可以从X11获取初始位置,并使用相对坐标来跟踪指针:

 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <linux/input.h> #include <fcntl.h> #include <X11/Xlib.h> #define MOUSEFILE "/dev/input/event6" 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) { rootX += ie.value; } else if (ie.code == 1) { rootY += ie.value; } printf("time%ld.%06ld\tx %d\ty %d\n", ie.time.tv_sec, ie.time.tv_usec, rootX, rootY); } else if (ie.type == 1) { if (ie.code == 272 ) { printf("Mouse button "); if (ie.value == 0) printf("released!!\n"); if (ie.value == 1) printf("pressed!!\n"); } 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; } 

鼠标只发送相对移动,而不是绝对位置。 你必须自己跟踪它,当你收到一个鼠标按钮的事件,你必须检查自己的位置坐标。