2012-10-24 243 views
1

我需要爲我的項目模擬一些鼠標事件和鍵盤事件,並且無法找到有關相同的大量信息。模擬鼠標事件和鍵盤事件C++ linux

我嘗試了模擬鼠標這是我從計算器後得到了原X11代碼,它似乎很好地工作,但我無法理解的代碼:

void mouseClick(int button) 
{ 
    Display *display = XOpenDisplay(NULL); 

    XEvent event; 

    if(display == NULL) 
    { 
     fprintf(stderr, "Errore nell'apertura del Display !!!\n"); 
     exit(EXIT_FAILURE); 
    } 

    memset(&event, 0x00, sizeof(event)); 

    event.type = ButtonPress; 
    event.xbutton.button = button; 
    event.xbutton.same_screen = True; 

    XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &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); 
    } 

    if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Error\n"); 

    XFlush(display); 

    usleep(100000); 

    event.type = ButtonRelease; 
    event.xbutton.state = 0x100; 

    if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Error\n"); 

    XFlush(display); 

    XCloseDisplay(display); 
} 

,所以我想問問如果沒有經過所有這些,對xlib庫有更簡單的抽象,因爲我甚至需要模擬可以用於g ++的鍵盤動作。

回答

0

XSendEvent不起作用,因爲許多應用程序丟棄通過XSendEvent假鍵盤事件。

模擬鍵盤事件的最佳方法是使用XTestFakeKeyEvent API。

以下代碼將模擬F5按鍵事件。

XTestFakeKeyEvent(display, XKeysymToKeycode(display, XK_F5), True, 0); 
XTestFakeKeyEvent(display, XKeysymToKeycode(display, XK_F5), False, 0);