x11 - XGrabKeyboard后无法移动窗口

时间:2013-01-27 09:48:22

标签: x11 c window c++ user-interface

调用XGrabKeyboard()后,我的应用程序会捕获并显示所有按键/按键,包括GUI和PrintScreen键。 然而,用户无法再移动应用程序的窗口。到目前为止,这种情况发生在Fedora 17和Ubuntu 12.04上。

如何在XGrabKeyboard()

的影响下允许用户移动应用程序

以下是我的Qt应用程序的示例代码:

bool KeyboardStatus::x11Event(XEvent *event) {
    switch (event->type) {
        case FocusIn:
            XGrabKeyboard(x11Info().display(), winId(), false, GrabModeAsync, GrabModeAsync, CurrentTime);
            break;

        case FocusOut:
            XUngrabKeyboard(x11Info().display(), CurrentTime);
            break;

        case KeyPress:
            // Display which key was pressed to user
            return true;

        case KeyRelease:
            // Display which key was released to user
            return true;
    }

    return false;
}

将抓取语句从事件处理程序中取出并不能解决问题。这是一个示例项目,用于说明问题:TestGrab.zip

2 个答案:

答案 0 :(得分:1)

我在KDE,FVWM和GNOME上尝试过这个(只使用Xlib),只有GNOME窗口管理器有这个问题。

我认为可以通过拾取ConfigureNotify事件来修复它,但是当您尝试移动窗口时不会生成它。

答案 1 :(得分:1)

我在Cygwin上遇到过与XFCE类似的问题。这里的问题是传递给XSelectInput的输入掩码不足。将 FocusChangeMask 添加到KeyPressMask | KeyReleaseMask解决了这个问题。

再一次,它帮助我解决了xfce / cygwin上的类似问题。