2014-03-06 6 views
2

XLib를 사용하여 키 누르기 이벤트를 잡으려고합니다. 하지만 몇 가지 이유로 XNextEvent가 작동하지 않습니다. 오류가 발생하지 않지만 내 프로그램이 "XNextEvent"호출 행에 멈춰있는 것처럼 보입니다. X11 윈도우 시스템이 어떻게 작동하는지XNextEvent가 작동하지 않습니다.

#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <X11/Xlib.h> 
#include <X11/Xutil.h> 

using namespace std; 


int main() 
{ 
    XEvent event; 
    KeySym key; 
    char text[255]; 
    Display *dis; 

    dis = XOpenDisplay(NULL); 
    while (1) { 
     XNextEvent(dis, &event); 
     if (event.type==KeyPress && XLookupString(&event.xkey,text,255,&key,0) == 1) { 
      if (text[0]=='q') { 
       XCloseDisplay(dis); 
       return 0; 
      } 
      printf("You pressed the %c key!\n", text[0]); 
     } 
    } 
    return 0; 
} 
+1

는 "작동하지 않는"** 좋은 진단 ** 적이 없다. 무슨 일이야 ? 오류 메시지가 있습니까? 또는 예기치 않은 결과가 있습니까? ** ** 귀하의 질문을 정확하게 편집하십시오 ** 어떻게 작동하지 않습니다. – hivert

+0

@hivert 문제가 무엇인지 분명히합니다. 편집 필요 없음 –

+0

어쩌면 좋은이 질문을하는 방법이 중요합니다. – hivert

답변

1

이되지 않습니다 : 다음은 내 코드입니다.

신중하게 this을 읽으십시오. 중요한 점은 다음과 같습니다

이벤트의 소스는 포인터에있는 볼 수있는 창입니다

당신은 창을 생성하지 않는 때문에 프로그램이 키보드 이벤트를 수신하지 않습니다..

이러한 이벤트를보고하는 데 X 서버가 사용하는 창은 창 계층 구조에서 창의 위치 및 이러한 이벤트의 생성을 금지하는 중재 창이 있는지 여부에 따라 다릅니다.

+0

어떤 키보드가 현재 활성화되어 있어도 상관 없으므로 키보드 이벤트를 전역으로 수신해야합니다. xlib로 가능합니까 아니면 다른 lib를 사용해야합니까? 감사! – Alexweb

+0

@Alexweb은 xlib로 가능한지 확실하지 않습니다. –

1

작업을 예를

#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <X11/Xlib.h> 
#include <X11/Xutil.h> 

using namespace std; 


int main() 
{ 
    XEvent event; 
    Display *dis; 
    Window root; 
    Bool owner_events = False; 
    unsigned int modifiers = ControlMask | LockMask; 


    dis = XOpenDisplay(NULL); 
    root = XDefaultRootWindow(dis); 
    unsigned int keycode = XKeysymToKeycode(dis, XK_P); 
    XSelectInput(dis,root, KeyPressMask); 
    XGrabKey(dis, keycode, modifiers, root, owner_events, GrabModeAsync, GrabModeAsync); 

    while (1) { 
     Bool QuiteCycle = False; 
     XNextEvent(dis, &event); 
     if (event.type == KeyPress) { 
      cout << "Hot key pressed!" << endl; 
      XUngrabKey(dis, keycode, modifiers, root); 
      QuiteCycle = True; 
     } 
     if (QuiteCycle) { 
      break; 
     } 
    } 
    XCloseDisplay(dis); 
    return 0; 
} 
+0

방금 ​​예제를 시도했지만 작동하지 않습니다. –