2013-02-01 5 views
1

우분투 12.04에서 xlib을 사용하여 마우스 클릭 이벤트를 보내려고합니다. 모든 작업이 데스크탑 바 아이콘에서 클릭을 할 때 작동합니다. 각 창 제목 표시 줄 (닫기, 최소화, 창 최대화)을 클릭하십시오. 그러나 일부 창에서는 내부 클릭이 작동하지 않습니다. 내 Qt 작성자 윈도우에서만 작동하지만, 예를 들어 집 폴더 아이콘을 클릭하면 폴더 안의 마우스, 폴더 나 메뉴 막대에서 클릭을 수행 할 수 없으며 창 제목 막대에서만 작동합니다.Xlib XSendEvent 클릭 이벤트가 우분투 12.04의 일부 창 안에서 작동하지 않습니다.

아마도 Ubuntu Unity 바탕 화면의 버그입니까? 여기에 내가 인터넷에서 찾아 내 코드입니다 :

#include <unistd.h> 

#include <X11/Xlib.h> 
#include <X11/Xutil.h> 

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, "Errore nell'invio dell'evento !!!\n"); 

    XFlush(display); 

    usleep(100000); 

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

    if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n"); 

    XFlush(display); 

    XCloseDisplay(display); 
} 

내 우분투는 VM웨어 플레이어의 내부가, 내가, Xlib를의 XWarpPointer를 사용하여 커서를 이동 어떤 도움 주셔서 감사합니다.

+2

많은 (아마도 대부분의?) 프로그램이 XSendEvent에서 이벤트를 무시한다는 것을 읽었습니다. 가능한 해결 방법은 다음과 같습니다. http://www.semicomplete.com/blog/geekery/xsendevent-xdotool-and-ld_preload.html – tecu

+0

감사합니다.이 문제가 발견 될 때 유용 할 것입니다.하지만 제 경우에는 그렇습니다. 간단한 폴더 창에서 클릭을 시도하고 작동하지 않으면 xdotools를 사용하여 동일한 작업을 시도한 다음 XSendEvent가 작동하지만 xdotools가 더 많은 작업을 수행하고 있습니다. –

답변

1

나는 동일한 문제가 있었고 방금 Xext와 Xtest 확장을 사용하여 해결했습니다.

#include <X11/extensions/XTest.h> 

int main(int argc, char ** argv) 
{ 
    XEvent event; 
    Display *dpy = XOpenDisplay (NULL); 

    /* Fake the mouse button Press and Release events */ 
    XTestFakeButtonEvent (dpy, 1, True, CurrentTime); 
    XTestFakeButtonEvent (dpy, 1, False, CurrentTime); 
    XCloseDisplay (dpy); 
    return 0; 
}