您可以使用 QX11Info 类从 Qt 查询 X11 信息。请参阅其文档。然后您可以从中使用原始 Xlib。
您可以使用XGrabPointer()
. 如果你使用它,其他应用程序在抓取指针时不会收到指针事件。man XGrabPointer
会帮助你。
订阅事件的“正常”方式是XSelectInput()
在窗口上使用,但问题是您必须在每个现有窗口上调用 XSelectInput。请参阅其手册页...
我知道 xxf86dga 扩展有一些与鼠标相关的调用,但我不确定它们是做什么的。
XQueryPointer()
是另一种查询指针状态而不从其他窗口窃取事件的方法。
我能想到的唯一其他地方是 XInput 扩展,但我也不确定它是否会对您有所帮助。
xev
有关处理 X11 事件的良好参考,请参阅源代码:http: //cgit.freedesktop.org/xorg/app/xev
使用 XGrabPointer 的示例代码:
#include <stdio.h>
#include <assert.h>
#include <X11/Xlib.h>
int main(void)
{
Display *d;
Window root;
d = XOpenDisplay(NULL);
assert(d);
root = DefaultRootWindow(d);
XGrabPointer(d, root, False, ButtonPressMask | ButtonReleaseMask |
PointerMotionMask, GrabModeAsync, GrabModeAsync, None,
None, CurrentTime);
XEvent ev;
while (1) {
XNextEvent(d, &ev);
switch (ev.type) {
case ButtonPress:
printf("Button press event!\n");
break;
case ButtonRelease:
printf("Button release event!\n");
break;
case MotionNotify:
printf("Motion notify event!\n");
break;
default:
printf("Unknown event...\n");
}
}
XCloseDisplay(d);
return 0;
}
编译使用:gcc x11mouse.c -o x11mouse -lX11