Qt: контролировать событие щелчка глобального курсора с X11?

Я хочу захватить глобальное событие щелчка мыши в 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);
    }
};

ОБНОВИТЬ

Я имею в виду за окном, код выше работает, когда я нажимаю на окно.

1 ответ

Решение

Вы можете запросить информацию X11 из Qt, используя класс QX11Info. Смотрите его документацию. Тогда вы можете использовать сырой Xlib из него.

Ты можешь использовать XGrabPointer(), Если вы используете его, другие приложения не будут получать события указателя, пока он захвачен. man XGrabPointer поможет вам.

"Нормальный" способ подписки на события заключается в использовании XSelectInput() в окне, но проблема в том, что вам придется вызывать XSelectInput для каждого существующего окна. Смотрите его справочную страницу...

Я знаю, что расширение xxf86dga имеет несколько вызовов, связанных с мышью, но я не уверен, что они делают.

XQueryPointer() это еще один способ запроса состояния указателя без кражи событий из других окон.

Единственное другое место, о котором я могу подумать, - это расширение XInput, но я не уверен, что оно вам тоже поможет.

Увидеть xev исходный код для хорошей справки по обработке событий X11: 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

Другие вопросы по тегам