用Xlib捕获鼠标

Jak*_* M. 6 c 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 %d y %d\n", event.xmotion.x, event.xmotion.y );
                break;
        }
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有关:

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

gee*_*aur 6

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

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