2012-10-03 42 views
3

以下代码段可用于大多数时间,除了某些窗口。例如,在最新的Ubuntu下,它不适用于在文件浏览器中选择文件夹。它似乎在其他任何地方都有效,但这种差距非常显着。我怀疑它与我如何使用XQueryPointer有关,但我已经尝试过几乎所有可以找到的示例。如果我使用电脑的鼠标,它的工作很好。 FYI:我已经尝试了这些问题的答案: Sending Programmatic events Capuring Mouse Input 但他们不工作有什么不同?发送X11点击事件不适用于某些窗口

下面的代码:

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

您应该使用XTest扩展。 – ninjalj

回答

3

由于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。

+0

非常感谢!真的行! :) –

+0

非常感谢你!它解决了我的问题! –

相关问题