调用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
答案 0 :(得分:1)
我在KDE,FVWM和GNOME上尝试过这个(只使用Xlib),只有GNOME窗口管理器有这个问题。
我认为可以通过拾取ConfigureNotify事件来修复它,但是当您尝试移动窗口时不会生成它。
答案 1 :(得分:1)
我在Cygwin上遇到过与XFCE类似的问题。这里的问题是传递给XSelectInput的输入掩码不足。将 FocusChangeMask 添加到KeyPressMask | KeyReleaseMask解决了这个问题。
再一次,它帮助我解决了xfce / cygwin上的类似问题。