5

以下代码片段在大多数情况下都有效,但在某些窗口中除外。例如,在最新的 Ubuntu 下,它不适用于在文件资源管理器中选择文件夹。它似乎在其他任何地方都有效,但这种差距很大。我怀疑这与我使用 XQueryPointer 的方式有关,但我已经尝试了几乎所有能找到的示例。如果我改用电脑的鼠标,它工作得很好。仅供参考:我已经尝试过这些问题的答案: 发送编程事件 捕获鼠标输入 ,但它们的工作方式没有任何不同......

这是代码:

#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);
}
4

2 回答 2

5

感谢 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。

于 2012-10-03T23:39:42.910 回答
1

这个链接也很有用:

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/

于 2014-07-01T21:14:52.407 回答