2

ユーザーがキーボードのキーを押すか、マウスを動かすかを検出する小さなC++プログラムを作成しようとしています。そのプログラムは、Ubuntu または Centos で実行する必要があります。そのため、キー押下の検出には X11 ライブラリを使用します。

私がググったコードは次のとおりです。

    #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);

        }
    }

それはうまくいきますが、私にとっては適切ではありません。独自のプログラムを除くすべてのウィンドウで入力用にキーボードをロックします(ループの最初と最後の行のコメントを外すと、同じ結果が得られました)。

どうすれば修正できるか、または代わりに使用できるライブラリを誰かが知っているかもしれません。

ありがとう。

4

1 に答える 1

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;
    }
于 2012-11-28T12:45:14.860 に答える