2012-11-26 79 views
1

我想寫的小C++程序,應該檢測到的是用戶按鍵盤上的任何鍵 或使鼠標移動。我需要在Ubuntu或Centos上運行該程序。 這就是爲什麼按鍵檢測我使用X11庫。C++和XGrabKeyboard鍵盤鎖

下面是代碼,我用Google搜索:

#include <stdio.h> 
    #include <cstring> 
    #include <iostream> 
    #include <X11/Xlib.h> 
    #include <X11/Xutil.h> 

    using namespace std; 

    int main(void) 
    { 
     Display * dpy = XOpenDisplay(0x0); 
     XEvent ev; 

     if(!dpy) return 1; 

     Time t = CurrentTime; 
     XGrabKeyboard(dpy, DefaultRootWindow(dpy), false, 
          GrabModeAsync, GrabModeAsync,t); 

     for(;;) 
     { 
      //XGrabKeyboard(dpy, DefaultRootWindow(dpy), false, 
      //     GrabModeAsync, GrabModeAsync,t); 
      XNextEvent(dpy, &ev); 
      if(ev.type == KeyPress) 
       cout << "Key pressed" << endl; 
      // XGrabKeyboard(dpy, DefaultRootWindow(dpy), false,     
      //      GrabModeAsync, GrabModeAsync,t); 

     } 
    } 

它的工作好,但不正確我。 它鎖定鍵盤輸入除了它自己的程序之外的所有窗口(取消註釋循環中的第一行和最後一行給了我相同的結果)。

也許有人知道我該如何解決這個問題,或者我可以用什麼庫代替。

謝謝。

回答

0

XSendEvent()幫助我。見http://tronche.com/gui/x/xlib/event-handling/XSendEvent.html

switch(ev.type) 
    { 
    case KeyPress: 
     XSendEvent(display,InputFocus,False,KeyPressMask,&ev); 
     break; 
    case KeyRelease: 
     XSendEvent(display,InputFocus,True,KeyReleaseMask,&ev); 
     break; 
    case ButtonPress: 
     XSendEvent(display,PointerWindow,True,ButtonPressMask,&ev); 
     break; 
    case ButtonRelease: 
     XSendEvent(display,PointerWindow,True,ButtonPressMask,&ev); 
     break; 
    default: 

     break; 
    } 
+1

這只是工作,如果應用程序沒有忽略合成的事件,比如'xterm'確實出於安全原因。 –