2012-10-03 66 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

非常感謝你!它解決了我的問題! –

相關問題