如何在linux中读取低级鼠标点击位置
How to read low level mouse click position in 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.%06ldttype %dtcode %dtvalue %dn",
ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value);
}
return 0;
}
它以以下格式给我结果:
时间1342517261.840285类型2代码0值-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.%06ldtx %dty %dn",
ie.time.tv_sec, ie.time.tv_usec, rootX, rootY);
} else
printf("time %ld.%06ldttype %dtcode %dtvalue %dn",
ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value);
}
return 0;
}
XQueryPointer似乎是更方便的解决方案。谢谢@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.%06ldtx %dty %dn",
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.%06ldttype %dtcode %dtvalue %dn",
ie.time.tv_sec, ie.time.tv_usec, ie.type, ie.code, ie.value);
}
}
return 0;
}
鼠标只发送相对移动,而不是绝对位置。你必须自己跟踪它,当你收到鼠标按钮事件时,你必须检查你自己的位置坐标。
相关文章:
- 使用 dlib 记录鼠标位置
- 获取窗口中的鼠标位置
- 将文本添加到鼠标位置时,请单击“给出分割故障”
- 在鼠标位置移动精灵
- 如何在Mac OSX上的窗口客户端内获取真实的鼠标位置?
- 如何始终获得QT鼠标位置
- QT QgraphicView和Qgraphicscene鼠标位置
- QT:QGraphicsScene鼠标位置始终(0,0)
- SFML鼠标位置和碰撞从文件加载
- 根据鼠标位置缩小到窗口中
- 如何根据鼠标位置旋转精灵
- OpenGL获取离当前鼠标位置最近的世界三维点的三维坐标
- C++ SDL 根据鼠标位置绘制动态矩形
- 如何检索WM_COMMAND中的鼠标位置
- Qt mouseMoveEvent-跟踪鼠标位置
- OpenGl获取鼠标位置
- 获取RGBDemo的鼠标位置坐标
- 通过互联网发送鼠标位置
- 如何使用可可获得鼠标位置差异的变化
- 鼠标位置并单击 sfml 中的检测