我希望将键盘输入重定向到不同的窗口,具体取决于键。并非所有密钥都会重定向到同一个窗口,我无法使用XSetInputFocus
。
我发现我可以抓住某些键,然后将事件发送到右侧窗口。 我像这样使用XGrabKey
XGrabKey( mDisplay(),
XKeysymToKeycode(mDisplay(),XK_F1) ,
AnyModifier ,
RootWindow(mDisplay(), mScreenNum),
false, //Events aren't sent to the focused window
GrabModeAsync,
GrabModeAsync );
它不适用于F1到F4键,但适用于F5和F6。对于像e,r和t这样的常规键,它也不起作用。可能还有其他人。 我需要能够重定向Fkeys,所以这个解决方案对我没用。
我尝试使用XGrabKeyboard,就像这样
XGrabKeyboard(mDisplay(),
RootWindow(mDisplay(), mScreenNum),
false,
GrabModeAsync,
GrabModeAsync,
CurrentTime);
它适用于所有Fkeys,但它产生了其他问题。当抓取键盘处于活动状态时,我无法再使用鼠标移动窗口(如果应用程序移动窗口,它仍可正常工作),我无法访问上下文菜单和闪烁的' |'没有在打字区域显示。
这个问题已经被人们讨论过了there,但他们没有找到解决方案。我使用的是Lubuntu(LXDE),而不是GNOME和我仍然有同样的问题
当键盘未被抓取时,我右键单击
显示上下文菜单,没有取消映射事件。
当我退出上下文菜单时:
我有3个unmap事件:(我打印Unmap旁边的窗口名称)
Unmap pcmanfm
Unmap pcmanfm
Unmap
当抓住键盘 时,我右键单击
我只有1个unmap事件:
Unmap
在显示之前,上下文菜单似乎未映射。
我想 :
谢谢。
答案 0 :(得分:5)
我找不到XGrabKeyboard问题的解决方案。
某些密钥的XGrabKey失败了,因为它们已经被OpenBox抓住了。 Openbox有一些使用XGrabKey的内置热键。因为我使用AnyModifier
,如果已经进行了包含此键的任何抓取,则抓取将失败。
例如,如果程序抓取Ctrl+F1
,则无法使用AnyModifier抓取F1。您可以在不使用修饰符的情况下抓取F1,但如果用户按下Alt+F1
,则抓取功能不会处于活动状态。
为了解决这个问题,我删除了Openbox的键盘热键,因为它们对我来说并不重要。为此,我修改了configuration file。
另一个解决方案是使用所有修改器但是已经抓住的修改器来获取密钥。不使用修饰符来抓取键是不够的,因为例如Num-Lock是一个修饰符,你可能不希望你的抓取是否有效取决于Num-Lock。