【问题标题】:Redirect Keyboard input with XGrabKey or XGrabKeyboard使用 XGrabKey 或 XGrabKeyboard 重定向键盘输入
【发布时间】:2014-06-19 07:21:22
【问题描述】:

目标

我想根据键将键盘输入重定向到不同的窗口。不是所有的键都会重定向到同一个窗口,我不能用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);

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

其他信息

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

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

  • 当键盘没有被抓住并且我右击

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

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

    我有 3 个取消映射事件:(我在 Unmap 旁边打印窗口的名称)

Unmap pcmanfm  
Unmap pcmanfm 
Unmap
  • 当键盘被抓住并且我右击

    我只有 1 个取消映射事件:

Unmap

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


我的要求

我想任一

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

谢谢。

【问题讨论】:

    标签: c++ keyboard xlib


    【解决方案1】:

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

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

    例如,如果一个程序抓取Ctrl+F1,则您无法使用 AnyModifier 抓取 F1。您可以不带修饰符抓取 F1,但如果用户按 Alt+F1 为例,抓取将不会处于活动状态。

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

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

    【讨论】:

    • 但这是主要目标的解决方案,对吧?
    • 我不太明白你的问题。是的,这是我用来解决我遇到的问题的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多