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

标签 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。可能还有其他人。 我需要能够重定向 Fkey,因此此解决方案对我不起作用。


第二次尝试:XGrabKeyboard

我试过 XGrabKeyboard , 像这样

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

它适用于所有 Fkeys,但它产生了其他问题。当抓取键盘处于事件状态时,我无法再使用鼠标移动窗口(如果应用程序移动其窗口,它仍然有效),我无法访问上下文菜单和闪烁的“|”不显示在输入区域。

其他信息

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

取消映射事件可能会给出一些信息:

  • When the keyboard is not grabbed and I right click

    the context menu is displayed, no unmap event.

  • When I exit the context menu :

    I have 3 unmap events : (I print the name of the window next to Unmap)

Unmap pcmanfm  
Unmap pcmanfm 
Unmap
  • When the keyboard is grabbed and I right click

    I have just 1 unmap event :

Unmap

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


我要的是什么

我想要么:

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

谢谢。

最佳答案

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

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

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

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

另一种解决方案是使用除已被抓取的修饰符以外的所有修饰符来抓取 key 。在没有修饰符的情况下抓取键是不够的,因为例如 Num-Lock 是一个修饰符,您可能不希望您的抓取激活或不激活取决于 Num-Lock。

关于c++ - 使用 XGrabKey 或 XGrabKeyboard 重定向键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23430995/

相关文章:

c++ - mysqlpp 中的引用错误

c++ - 振奋精神 : how to parse until we have "->"

c++ - 允许使用哪些 token 作为#include的参数?

java - 自定义键盘候选 View 导致 Gmail EditText 跳转

c - 即使缓冲区已在 Xlib 中刷新,该行也未显示

c++ - C++中声明和定义分开的优点和缺点是什么?

ios - 带有 keyboardAccessoryView 的 UITextView Keyboard 在 Springboard 之后变为蓝色(倒置)

macos - 使用 Macbook 命令行进行按键重新映射

在 X11 事件循环中可以捕获操纵杆/游戏 handle 事件吗?

linux - 暂停具有打开菜单的应用程序会卡住 unix 桌面