2011-04-27 70 views
1

我正在編程遠程觸摸板。所以我需要在C++的Linux上模擬鼠標按鍵。我使用Xlib函數來做到這一點。鼠標按鍵模擬 - 右鍵和上下文菜單問題

這兩個觸摸板按鈕的工作原理都很好,但是例如,當我在Linux桌面上按右鍵時,出現上下文菜單,然後通過左按鈕模擬就不可能選擇任何東西。我甚至無法通過點擊外部菜單來擺脫該上下文菜單。

你能幫我一下如何讓我的模擬觸摸板按鈕表現得像真正的那樣嗎?

這裏是我的代碼:

void MainWindow::mouseClick(int button) 
{ 
    // Open X display 
    Display *display = XOpenDisplay (NULL); 
    if (display == NULL) 
    { 
     cerr << "Can't open display!" << endl; 
    } 

    // Create and setting up the event 
    XEvent event; 
    memset (&event, 0, sizeof (event)); 
    event.xbutton.button = button; 
    event.xbutton.same_screen = True; 

    XQueryPointer (display, RootWindow(display, DefaultScreen(display)), 
        &event.xbutton.root, &event.xbutton.subwindow, 
        &event.xbutton.x_root, &event.xbutton.y_root, 
        &event.xbutton.x, &event.xbutton.y, 
        &event.xbutton.state); 

    event.xbutton.subwindow = event.xbutton.window; 

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

    // Press 
    event.type = ButtonPress; 
    if (XSendEvent (display, PointerWindow, True, 0xfff, &event) == 0) cerr << "Error to send the event!" << endl; 
    XFlush (display); 
    usleep (1); 

    // Release 
    event.type = ButtonRelease; 
    event.xbutton.state = 0x100; 
    if (XSendEvent (display, PointerWindow, True, 0xfff, &event) == 0) cerr << "Error to send the event!" << endl; 
    XFlush (display); 
    usleep (1); 

    XCloseDisplay (display); 
} 

回答

1

我遇到了類似的問題在處理的Xlib。我終於結束了使用Xtest庫。這很簡單。只需在你的Linux機器上安裝libxtst。

XTestFakeMotionEvent(display, -1, x, y, CurrentTime); 
XTestFakeButtonEvent(display, button, True, CurrentTime); //Mouse down 
XTestFakeButtonEvent(display, button, False, CurrentTime); //Mouse up 

根本不用擔心windows的層次結構!