我想根据键将键盘输入重定向到不同的窗口.并非所有的密钥都会被重定向到同一个窗口,我无法使用XSetInputFocus.
我发现我可以抓住某些键,然后将事件发送到右侧窗口.我像这样使用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(mDisplay(),
RootWindow(mDisplay(), mScreenNum),
false,
GrabModeAsync,
GrabModeAsync,
CurrentTime);
Run Code Online (Sandbox Code Playgroud)
它适用于所有Fkeys,但它产生了其他问题.当抓取键盘处于活动状态时,我无法再使用鼠标移动窗口(如果应用程序移动窗口,它仍可正常工作),我无法访问上下文菜单和闪烁的"|" 在键入区域中不显示.
这个问题已经在那里讨论过,但他们没有找到解决方案.我使用的是Lubuntu(LXDE)而不是GNOME,我仍然遇到同样的问题.
当没有抓住键盘时我点击右键
显示上下文菜单,没有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对于某些键失败,因为它们已被OpenBox抓取。Openbox具有一些使用XGrabKey的内置热键。因为我使用AnyModifier,所以如果进行了包含此密钥的任何抓取,则抓取将失败。
例如,如果某个程序Ctrl+F1被捕获,则无法使用AnyModifier捕获F1。您可以在不使用修饰符的情况下抓取F1,但是如果用户按下Alt+F1例如,抓取将不会激活。
为了解决此问题,我删除了Openbox的键盘热键,因为它们对我而言并不重要。为此,我修改了配置文件。
另一种解决方案是使用所有修饰符来获取键,但已获取的键除外。没有修饰符就抓住键是不够的,因为例如Num-Lock是修饰符,并且您可能不希望您的抓斗处于活动状态或不依赖于Num-Lock。
| 归档时间: |
|
| 查看次数: |
1619 次 |
| 最近记录: |