我想编写一个小窗口程序,它将在屏幕上的任何位置显示指针位置(和其他信息)。我不想破坏所有其他程序运行中鼠标的正常使用。有没有办法去"勾"指针运动事件,或者如何在事件循环中设置用于轮询指针位置的计时器事件?
答案 0 :(得分:2)
我想指出Xautolock code queryPointer function,它会找出鼠标的位置。如果你在main.c
和diy.c
中挖掘,你应该获得足够的信息,说明根据鼠标光标位置和空闲超时采取行动的必要条件。
实际上,它只使用XQueryPointer来获取信息。但是,您应该记住,所有鼠标移动都是相对的,因此您必须根据初始位置保持状态。示例代码见another SO thread。
由于Xautolock代码显然不是很明显,所以我对那些我认为你正在寻找的东西进行了抨击。这是一组最小的代码,只是将x / y坐标转储到stdout。如果你想静态地使用它们,你将不得不创建和定位一个窗口来绘制一些文本。按照此代码的分辨率为1ms进行轮询,程序在我的机器上占用大约0.1%的CPU(Intel(R) Core(TM) i7-4558U CPU @ 2.80GHz
)。
#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;
}