发送X11 Click事件不会与一些窗口工作(Sending X11 click event doe

2019-09-23 09:38发布

下面的代码片段工作的大部分时间,除了在某些窗口。 例如,最新的Ubuntu下它不会在文件浏览器中选择文件夹的工作。 它似乎工作只是在其他地方,但这种差距是显著。 我怀疑它与我如何使用XQueryPointer做的,但我已经试过几乎所有的例子我能找到。 如果我使用电脑的鼠标,相反,它的工作的罚款。 FYI:我已经尝试了这些问题的答案: 发送纲领性事件 Capuring鼠标输入 ,但他们不工作有什么不同?

下面的代码:

#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

void SendClick(int button, int down) {
    Display *display = XOpenDisplay(NULL);
    XEvent event;

    if(display == NULL)
    {
        return;
    }

    memset(&event, 0, sizeof(event));

    event.xbutton.button = button;
    event.xbutton.same_screen = True;
    event.xbutton.subwindow = DefaultRootWindow (display);

    while (event.xbutton.subwindow)
    {
      event.xbutton.window = event.xbutton.subwindow;
      XQueryPointer (display, event.xbutton.window,
             &event.xbutton.root, &event.xbutton.subwindow,
             &event.xbutton.x_root, &event.xbutton.y_root,
             &event.xbutton.x, &event.xbutton.y,
             &event.xbutton.state);
    }

    event.type = down ? ButtonPress : ButtonRelease;

    XSendEvent(display, PointerWindow, True, down ? ButtonPressMask : ButtonReleaseMask, &event); 

    XFlush(display);

    XCloseDisplay(display);
}

Answer 1:

由于ninjalj以上的评论对把我在正确的轨道上。 我不喜欢依靠的扩展,做到这一点,它创建额外的依赖关系的想法,但它是一个非常标准的扩展了。 完美的作品...

对于运行到同一问题,因为我,下面的代码块替换我用之前的代码工作得很好:

#include <X11/extensions/XTest.h>

void SendClick(int button, Bool down) {
    Display *display = XOpenDisplay(NULL);
    XTestFakeButtonEvent(display, button, down, CurrentTime);
    XFlush(display);
    XCloseDisplay(display);
}

矮得多!

对于Ubuntu的,不要忘了安装libxtst-dev软件包。 一定要-lXtst添加到您的LDFLAGS。



Answer 2:

这个环节也非常有用:

X11假鼠标事件生成使用XTEST扩展http://bharathisubramanian.wordpress.com/2010/04/01/x11-fake-mouse-events-generation-using-xtest/

这里是一个链接解释如何使用XTEST扩展假键盘事件的发生:

X11假关键事件生成使用XTEST扩展http://bharathisubramanian.wordpress.com/2010/03/14/x11-fake-key-event-generation-using-xtest-ext/



文章来源: Sending X11 click event doesn't work with some windows
标签: c x11