使用XGrabKey或XGrabKeyboard重定向键盘输入

时间:2014-05-02 14:50:55

标签: c++ keyboard xlib

目标

我希望将键盘输入重定向到不同的窗口,具体取决于键。并非所有密钥都会重定向到同一个窗口,我无法使用XSetInputFocus


第一次尝试:XGrabKey

我发现我可以抓住某些键,然后将事件发送到右侧窗口。 我像这样使用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,就像这样

XGrabKeyboard(mDisplay(), 
                        RootWindow(mDisplay(), mScreenNum),
                        false, 
                        GrabModeAsync, 
                        GrabModeAsync, 
                        CurrentTime);

它适用于所有Fkeys,但它产生了其他问题。当抓取键盘处于活动状态时,我无法再使用鼠标移动窗口(如果应用程序移动窗口,它仍可正常工作),我无法访问上下文菜单和闪烁的' |'没有在打字区域显示。

其他信息

这个问题已经被人们讨论过了there,但他们没有找到解决方案。我使用的是Lubuntu(LXDE),而不是GNOME和我仍然有同样的问题

unmap事件可能会提供一些信息:

  
      
  • 当键盘未被抓取时,我右键单击

         

    显示上下文菜单,没有取消映射事件。

  •   
  • 当我退出上下文菜单时:

         

    我有3个unmap事件:(我打印Unmap旁边的窗口名称)

  •   
Unmap pcmanfm  
Unmap pcmanfm 
Unmap
  
      
  • 当抓住键盘 时,我右键单击

         

    我只有1个unmap事件:

  •   
Unmap

在显示之前,上下文菜单似乎未映射。


我要的是什么

我想

  • 使用没有副作用的XGrabKeyboard
  • 将XGrabKey与任意键一起使用
  • 使用另一个允许我重定向键盘输入的功能

谢谢。

1 个答案:

答案 0 :(得分:5)

我找不到XGrabKeyboard问题的解决方案。

某些密钥的XGrabKey失败了,因为它们已经被OpenBox抓住了。 Openbox有一些使用XGrabKey的内置热键。因为我使用AnyModifier,如果已经进行了包含此键的任何抓取,则抓取将失败。

例如,如果程序抓取Ctrl+F1,则无法使用AnyModifier抓取F1。您可以在不使用修饰符的情况下抓取F1,但如果用户按下Alt+F1,则抓取功能不会处于活动状态。

为了解决这个问题,我删除了Openbox的键盘热键,因为它们对我来说并不重要。为此,我修改了configuration file

另一个解决方案是使用所有修改器但是已经抓住的修改器来获取密钥。不使用修饰符来抓取键是不够的,因为例如Num-Lock是一个修饰符,你可能不希望你的抓取是否有效取决于Num-Lock。