6

调用后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

4

2 回答 2

2

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

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

于 2013-02-12T11:04:55.737 回答
2

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

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

于 2016-02-22T18:36:31.473 回答