1

X11でグローバルマウスクリックイベントをキャプチャしたいのですが、

x11eventフィルターをインストールしようとしましたが、グローバルに機能しません。

class XApplication: public QApplication
{
  public:
    XApplication (int & argc, char **argv):
        QApplication (argc , argv)
    {
    }

protected:
    bool x11EventFilter (XEvent *e)
    {
        qDebug() << "X11 Event: " << e->type;
        return QApplication::x11EventFilter(e);
    }
};

アップデート

つまり、ウィンドウの外側です。ウィンドウをクリックすると、上記のコードが機能します。

4

1 に答える 1

3

QX11Infoクラスを使用して、QtからX11情報を照会できます。そのドキュメントを参照してください。次に、そこから生のXlibを使用できます。

を使用できますXGrabPointer()。これを使用すると、ポインターが取得されている間、他のアプリはポインターイベントを受信しません。man XGrabPointer手伝います。

イベントをサブスクライブする「通常の」方法はXSelectInput()ウィンドウで使用することですが、問題は、既存のすべてのウィンドウでXSelectInputを呼び出す必要があることです。そのマニュアルページを参照してください...

xxf86dga拡張機能にマウスに関連するいくつかの呼び出しがあることは知っていますが、それらが何をするのかわかりません。

XQueryPointer()他のウィンドウからイベントを盗むことなくポインターの状態を照会する別の方法です。

私が考えることができる他の唯一の場所はXInput拡張機能ですが、それがあなたにも役立つかどうかはわかりません。

xevX11イベントの処理に関する適切なリファレンスについては、ソースコードを参照してください:http: //cgit.freedesktop.org/xorg/app/xev

XGrabPointerを使用したサンプルコード:

#include <stdio.h>
#include <assert.h>
#include <X11/Xlib.h>

int main(void)
{
        Display *d;
        Window root;

        d = XOpenDisplay(NULL);
        assert(d);

        root = DefaultRootWindow(d);

        XGrabPointer(d, root, False, ButtonPressMask | ButtonReleaseMask |
                     PointerMotionMask, GrabModeAsync, GrabModeAsync, None,
                     None, CurrentTime);

        XEvent ev;
        while (1) {                     
                XNextEvent(d, &ev);  
                switch (ev.type) { 
                case ButtonPress:
                        printf("Button press event!\n");
                        break;
                case ButtonRelease:
                        printf("Button release event!\n");
                        break;
                case MotionNotify:
                        printf("Motion notify event!\n");
                        break;
                default:
                        printf("Unknown event...\n");
                } 
        } 

        XCloseDisplay(d);
        return 0;
}

使用してコンパイル:gcc x11mouse.c -o x11mouse -lX11

于 2012-04-12T14:53:58.347 に答える