Я тут работаю над самодельной экранной клавиатурой и для некоторой логики мне требуется следить за всеми нажатиям и отпусканиями клавиш - как виртуальными, так и хардварными. Само моё приложение написано на Qt.
Делаю так:
Display *display = QX11Info::display();
XSelectInput(display, DefaultRootWindow(display), KeyPressMask | KeyReleaseMask);
QApplication::instance()->installNativeEventFilter(this);
...
bool KeyboardWidget::nativeEventFilter(const QByteArray &eventType, void *message, long *) {
xcb_generic_event_t *ev = static_cast<xcb_generic_event_t*>(message);
switch (ev->response_type & ~0x80) {
case XCB_KEY_PRESS: {
xcb_key_press_event_t *key_press_event = reinterpret_cast<xcb_key_press_event_t*>(ev);
keyEventReceived(key_press_event->detail, true);
break;
}
case XCB_KEY_RELEASE: {
xcb_key_release_event_t *key_release_event = reinterpret_cast<xcb_key_release_event_t*>(ev);
keyEventReceived(key_release_event->detail, false);
break;
}
}
return false;
}
Пока окно приложения имело фокус, приём клавиатурных событий исправно работал (ещё бы он не работал), но как только я сделал так, чтобы окно фокус не получало (setWindowFlags(Qt::WindowStaysOnTopHint | Qt::ToolTip | Qt::FramelessWindowHint)), всё работать перестало. То есть по факту события глобально не ловятся. Что делать?