我想写一个小窗口程序,将显示屏幕上任何位置的指针位置(和其他信息)。 我不想在运行的所有其他程序中破坏鼠标的正常使用。 有没有办法“钩”指针动作事件,或者我如何设置一个计时器事件轮询我的事件循环中的指针位置?
我想指出你在Xautolock代码queryPointer函数 ,它指出了鼠标的位置。 如果在main.c
和diy.c
,还应该获得足够的关于根据鼠标光标位置和空闲超时进行操作的信息。
实际上,它只是使用XQueryPointer来获取信息。 但是,请记住,所有的鼠标移动都是相对的,所以您必须根据初始位置保持状态。 示例代码在另一个SO线程中找到。
由于从Xautolock代码中没有明显的表现,所以我把那些我认为正在寻找的东西拆掉了。 这是一组最简单的代码,只是将x / y坐标转储到标准输出。 如果你想静态的,你将不得不创建并定位一个窗口来绘制一些文本。 这个代码轮询分辨率为1ms,程序在我的机器( Intel(R) Core(TM) i7-4558U CPU @ 2.80GHz
)上占用大约0.1%的CPU。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <X11/Xos.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/Xatom.h> #include <X11/Xresource.h> static Window root; static void query_pointer(Display *d) { static int once; int i, x, y; unsigned m; Window w; if (once == 0) { once = 1; root = DefaultRootWindow(d); } if (!XQueryPointer(d, root, &root, &w, &x, &y, &i, &i, &m)) { for (i = -1; ++i < ScreenCount(d); ) { if (root == RootWindow(d, i)) { break; } } } fprintf(stderr, "X: %d Y: %d\n", x, y); } static int catchFalseAlarm(void) { return 0; } int main(void) { XSetWindowAttributes attribs; Display* d; Window w; if (!(d = XOpenDisplay(0))) { fprintf (stderr, "Couldn't connect to %s\n", XDisplayName (0)); exit (EXIT_FAILURE); } attribs.override_redirect = True; w = XCreateWindow(d, DefaultRootWindow (d), -1, -1, 1, 1, 0, CopyFromParent, InputOnly, CopyFromParent, CWOverrideRedirect, &attribs); XMapWindow(d, w); XSetErrorHandler((XErrorHandler )catchFalseAlarm); XSync (d, 0); for (;;) { query_pointer(d); usleep(1000); } return 0; }