C ++和XGrabKeyboard键盘锁定

时间:2012-11-26 18:25:49

标签: c++ qt x11 xlib

我正在尝试编写小型C ++程序,该程序应检测用户是否按下键盘上的任意键 或让鼠标移动。我需要的程序在Ubuntu或Centos上运行。 这就是按键检测我使用X11库的原因。

这是我用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);

        }
    }

它运作良好,但对我来说不合适。 它锁定所有窗口中的输入键盘,除了它自己的程序(在循环中取消注释第一行和最后一行给出了相同的结果)。

也许有人知道如何修复它或者我可以使用哪个库。

感谢。

1 个答案:

答案 0 :(得分: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;
    }