发送X11点击事件不适用于某些窗口

除了在某些窗口中,以下代码片段大部分时间都有效。 例如,在最新的Ubuntu下,它无法用于选择文件资源管理器中的文件夹。 它似乎适用于其他任何地方,但这种差距很大。 我怀疑它与我如何使用XQueryPointer有关,但我几乎尝试了所有可以找到的例子。 如果我使用计算机的鼠标,它工作正常。 仅供参考:我已经尝试过这些问题的答案: 发送程序化事件 获取鼠标输入,但它们没有任何不同……

这是代码:

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

感谢ninjalj上面的评论让我走上正轨。 我不喜欢依赖扩展来实现这一点以及它创建的额外依赖性的想法,但它也是一个非常标准的扩展。 完美的作品……

对于遇到与我相同问题的人,以下代码块替换了之前使用的代码并且运行良好:

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

矮得多!

对于Ubuntu,不要忘记安装libxtst-dev软件包。 一定要将-lXtst添加到LDFLAGS中。

此链接也很有用:

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

这是一个链接,解释如何使用XTest扩展来生成假键盘事件:

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