调用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;
}
从事件处理程序中删除 grab 语句并不能解决问题。下面是一个说明问题的示例项目:TestGrab.zip
我已经在KDE,FVWM和GNOME上尝试过这个(只是使用Xlib),只有GNOME窗口管理器有这个问题。
我认为可以通过拾取 ConfigureNotify 事件来修复它,但当您尝试移动窗口时不会生成它。
我在Cygwin上使用XFCE时遇到了类似的问题。这里的问题是传递给XSelectInput的输入掩码不足。将焦点更改掩码添加到按键掩码 |KeyReleaseMask解决了这个问题。
再一次,它帮助我解决了xfce/cygwin上的类似问题。