2014-03-06 227 views
2

我試圖使用XLib來捕捉按鍵事件。但由於某些原因,XNextEvent無法正常工作。 我沒有收到任何錯誤,但它看起來像我的程序卡在「XNextEvent」調用線上。 這裏是我的代碼: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

這不是X11系統是如何工作的。請仔細閱讀this。關鍵的一點是:

事件的來源是可視窗口指針是

不創建一個窗口,所以你的程序不接收鍵盤事件。即使你創建的窗口,它必須具有焦點:

使用的X服務器報告這些事件取決於窗口的窗口層次結構以及是否有任何插入的窗口禁止這些事件的發生位置的窗口。

+0

我需要在全球範圍內捕捉鍵盤事件,因此無論哪個窗口當前處於活動狀態都無關緊要。這可能與xlib或我應該使用另一個庫?謝謝! – 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

我剛試過你的例子,它不起作用。 –

相關問題