C 用Xlib捕捉鼠标

C 用Xlib捕捉鼠标,c,xlib,C,Xlib,我想写一个简单的Xlib程序来改变鼠标的行为(举个例子,反转垂直运动)。我在捕捉事件时遇到问题 我想把代码修改一下 捕捉控制器位置的变化(我向上移动鼠标,MotionEvent) 计算新光标位置(new_x-=差分_x) 设置新的光标位置(向下移动指针,XWarpPointer,防止在此生成事件) 下面的代码应该在每次移动鼠标时捕获一个运动事件,但它仅在指针从一个窗口移动到另一个窗口时生成事件。。。如何捕捉所有动作事件 #include "X11/Xlib.h" #include "stdi

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

我想把代码修改一下

  • 捕捉控制器位置的变化(我向上移动鼠标,
    MotionEvent
  • 计算新光标位置(
    new_x-=差分_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 %d y %d\n", event.xmotion.x, event.xmotion.y );
                break;
        }
    }

    return 0;
}
相关的:


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


还请注意,如果客户机在其“请勿传播”掩码中为其某个窗口指定了
PointerMotion
,您将不会在其窗口内收到任何指针移动事件(同样,除非您抓取)。

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

  • xinput--list
  • xinput——列出道具“USB光学鼠标”
  • xinput--设置道具“USB光学鼠标”“Evdev轴反转”10
  • xinput--设置道具“USB光学鼠标”“Evdev轴交换”1
  • 还有“坐标变换矩阵”属性,但由于某种原因,它现在对我不起作用

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

谢谢。在最理想的情况下,我想在X输入层处理鼠标事件之前抓取鼠标事件(但是搞乱鼠标驱动程序可能太少)。您知道这是否可能吗?X11通常不提供这种级别的控制;如果不能用xinputapi实现,那么确实需要在驱动程序或至少是服务器插件级别实现。X11在这方面不是很灵活。谢谢。反转轴只是一个例子,我想添加一些更奇特的东西:)