x11 – XGrabKeyboard后无法移动窗口

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

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

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

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

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