2013-06-07 2 views
3

C에서 모든 마우스 및 키보드 이벤트를 캡처하려는 간단한 프로그램을 작성 중입니다. "XGrapPointer"를 사용하려고했지만 화면이 잠겨서 다른 응용 프로그램으로 이동할 수 없습니다. "XSelectInput()"으로 시도했지만 키보드 이벤트가 성공적으로 수신되고 있지만 마우스 클릭 이벤트가 발생하지 않습니다.XSelectInput이 ButtonPressEvents에 대해 작동하지 않습니다. 어떻게해야합니까?

내가 어떻게 할 수 있습니까? 다음과 같이

코드 조각은 다음과 같습니다

#include <stdio.h> 
#include <stdlib.h> 
#include <X11/Xlib.h> 
#include <X11/Xutil.h> 
#include <X11/keysym.h> 

int main(int argc, char **argv) 
{ 
    Display *dpy; 
    Window root; 
    unsigned long event_mask; 
    event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask; 
    if((dpy = XOpenDisplay(NULL)) == NULL) { 
     perror(argv[0]); 
     exit(1); 
    } 
dpy = XOpenDisplay(NULL); 
root = XDefaultRootWindow(dpy); 

int state; 
XWindowAttributes attributes; 

XGetInputFocus(dpy,&root,&state); 
printf("window id = %d\n"); 
XSelectInput(dpy,root,event_mask); 


XEvent ev; 
    while(1) { 


     XNextEvent(dpy, &ev); 
    if(ev.type==ButtonRelease){ 
    printf("button release\n"); 
    } 

     if (ev.type== KeyPress) { 
    printf("keypress event\n"); 
     } 


    } 

return 0; 

} 
+0

이것은 현대 X11 서버/창 관리자에서는 작동하지 않습니다. [BadAccess] (http://stackoverflow.com/questions/16122196/getting-mouseclick-coordinates-with-xlib) 오류가 발생합니다. –

+2

"한 번에 하나의 클라이언트 만 이벤트 마스크 ButtonPressMask와 연결된 ButtonPress 이벤트를 선택할 수 있습니다." BadAccess 오류가 발생하지 않으면 WM이 가상 루트를 구현하고있는 것입니다. 가상 루트는 모든 마우스 이벤트를 가져오고 실제 루트는 아무 것도 얻지 못합니다. –

답변

2

루트 창을 사용하고있는 것처럼 뭔가 다른 이벤트를 얻는 것은 당신이 얻을 있는지 확인하기 위해이 거기에 아마, 마우스를 잡기 위해 필요한 모든 이벤트 만 당신이이 예제에서 q 키처럼 빠져 나갈 수있는 방법을 필요로하지 않도록 이벤트를 얻을 수있는 것은 아무것도 없습니다 :

#include <stdio.h> 
#include <stdlib.h> 
#include <X11/Xlib.h> 
#include <X11/Xutil.h> 
#include <X11/keysym.h> 

int main(int argc, char **argv) 
{ 
    Display *dpy; 
    Window root; 
    unsigned long event_mask; 
    event_mask = KeyReleaseMask | ButtonReleaseMask; 
    if((dpy = XOpenDisplay(NULL)) == NULL) { 
     perror(argv[0]); 
     exit(1); 
    } 
    dpy = XOpenDisplay(NULL); 
    root = XDefaultRootWindow(dpy); 

    XGrabPointer(dpy, root, False, ButtonReleaseMask, GrabModeAsync, 
     GrabModeAsync, None, None, CurrentTime); 

    int state; 
    XWindowAttributes attributes; 

    XGetInputFocus(dpy,&root,&state); 
    printf("window id = %d\n"); 
    XSelectInput(dpy,root,event_mask); 


    XEvent ev; 
    while(1) { 


    XNextEvent(dpy, &ev); 
    printf("Type: %d\n", ev.type); 

    if(ev.type==ButtonRelease){ 
     printf("button release\n"); 
    } 

    if (ev.type== KeyRelease) { 
     printf("keypress event\n"); 
     if (XLookupKeysym(&ev.xkey, 0) == XK_q) { 
     exit(0); 
     } 

    } 


    } 

    return 0; 

} 
+0

답장 NM 및 ParkyDr 귀하의 회신에 대한 .. 내 requrement 나는 "SelectInput()"키보드 이벤트에 대한 geting 같은 방식으로 사용하여 마우스 이벤트를 가져올 필요가있다. 악의적 인 액세스를 얻지 못해서 NM이 실제 루트에 대한 이벤트를 얻으려는 방법이 있습니까? 실제로 Grabpointer becoz를 사용할 수 없습니다. 초점이 맞춰진 창을 멈추고 종료하면 i 원하지 않는 전체 프로그램을 종료합니다. SelectInPut을 사용하여 마우스 클릭을 유도하는 방법이 있습니까? – user2314247

+0

내 대답은 XSelectInput()을 사용하지만 직접 창을 만들 경우에만 루트 창에서 작동하지 않습니다. 모든 이벤트를 원하면 포인터를 가져 오는 것이 유일한 옵션이거나 포커스가있는 창이 이벤트를 가져옵니다 – parkydr

+0

감사합니다 ParkyDr, 내가 말했듯이 루트 창에서 작동하도록 관리 할 수 ​​있다면 문제도 해결할 수 있습니다 . 나는 XSetSelectionOwner()를 보면서 curenlty를보고 있는데, 그것은 나를 위해 작동 할 것이다. 나의 목표는 클라이언트 ID가 마우스 이벤트를 받아들이지 않기 때문에 내가 선택한 윈도우를 다음과 같이 이벤트의 소유자로 설정할 수 있기 때문이다. 어떤 의미로든 마우스 클릭 이벤트를 얻을 수 있습니다. – user2314247