用Xlib捕获鼠标

我想编写一个简单的Xlib程序来改变鼠标的行为(举一个例子,反转垂直运动)。 我有捕获事件的问题。

我想要代码

  • 捕获控制器位置的变化(我向上移动鼠标, MotionEvent
  • 计算新光标位置( new_x -= difference_x
  • 设置新的光标位置(向下移动指针, XWarpPointer ,在此处阻止事件生成)

下面的代码应该在每次移动鼠标时捕获一个运动事件,但只有当指针从一个窗口移动到另一个窗口时它才会生成事件…如何捕获所有运动事件?

 #include "X11/Xlib.h" #include "stdio.h" int main(int argc, char *argv[]) { Display *display; Window root_window; XEvent event; display = XOpenDisplay(0); root_window = XRootWindow(display, 0); XSelectInput(display, root_window, PointerMotionMask ); while(1) { XNextEvent( display, &event ); switch( event.type ) { case MotionNotify: printf("x %dy %d\n", event.xmotion.x, event.xmotion.y ); break; } } return 0; } 

有关:

X11:我如何真正抓住鼠标指针?

当您的程序收到鼠标事件时,它会收到事件的副本; 副本也会发送到正在侦听这些事件的其他程序(请参阅XSelectInput(3) )。 如果不使用XGrabPointer(3)来获取鼠标的独占所有权,则无法覆盖此项,这将阻止其他程序接收任何鼠标事件。 简而言之,你实际上无法做你想做的事情。

另请注意,如果客户端在其窗口之一的do-not-propagate掩码中指定了PointerMotion ,则不会在其窗口内收到任何指针运动事件(除非您执行抓取操作)。

如果要在移动鼠标时更改鼠标的行为,我建议您使用输入属性而不是尝试在程序中进行处理。

  • xinput --list
  • xinput --list-props 'USB Optical Mouse'
  • xinput --set-prop 'USB Optical Mouse' 'Evdev Axis Inversion' 1 0
  • xinput --set-prop 'USB Optical Mouse' 'Evdev Axes Swap' 1
  • 还有“坐标转换矩阵”属性但由于某种原因它现在不适合我。

您不需要自己调用xinput程序:您可以使用Xlib调用(查看xinput的源代码)。