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

Hec*_*kel 7 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 );
Run Code Online (Sandbox Code Playgroud)

它不适用于F1到F4键,但适用于F5和F6.它也不适用于某些常规键,如e,r和t.可能还有其他人.我需要能够重定向Fkeys,所以这个解决方案对我不起作用.


第二次尝试:XGrabKeyboard

我尝试使用XGrabKeyboard,就像这样

XGrabKeyboard(mDisplay(), 
                        RootWindow(mDisplay(), mScreenNum),
                        false, 
                        GrabModeAsync, 
                        GrabModeAsync, 
                        CurrentTime);
Run Code Online (Sandbox Code Playgroud)

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

其他信息

这个问题已经在那里讨论过,但他们没有找到解决方案.我使用的是Lubuntu(LXDE)而不是GNOME,我仍然遇到同样的问题.

unmap事件可能会给出一些信息:

  • 没有抓住键盘时我点击右键

    显示上下文菜单,没有unmap事件.

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

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

Unmap pcmanfm  
Unmap pcmanfm 
Unmap
Run Code Online (Sandbox Code Playgroud)
  • 抓住键盘后我右键单击

    我只有一个unmap事件:

Unmap
Run Code Online (Sandbox Code Playgroud)

看起来上下文菜单在显示之前未映射.


我要的是什么

我想无论是:

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

谢谢.

Hec*_*kel 5

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

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

例如,如果某个程序Ctrl+F1被捕获,则无法使用AnyModifier捕获F1。您可以在不使用修饰符的情况下抓取F1,但是如果用户按下Alt+F1例如,抓取将不会激活。

为了解决此问题,我删除了Openbox的键盘热键,因为它们对我而言并不重要。为此,我修改了配置文件

另一种解决方案是使用所有修饰符来获取键,但已获取的键除外。没有修饰符就抓住键是不够的,因为例如Num-Lock是修饰符,并且您可能不希望您的抓斗处于活动状态或不依赖于Num-Lock。