以下代码片段大部分时间都有效,但在某些窗口中除外。例如,在最新的Ubuntu下,它不适用于在文件资源管理器中选择文件夹。它似乎适用于其他任何地方,但这种差距很大。我怀疑它与我如何使用XQueryPointer有关,但我几乎尝试了所有可以找到的例子。如果我使用计算机的鼠标,它工作正常。 仅供参考:我已经尝试过这些问题的答案: Sending Programmatic events Capuring Mouse Input 但他们没有任何不同......
以下是代码:
#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);
}
答案 0 :(得分: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。
答案 1 :(得分:1)
此链接也很有用:
使用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/