有人知道xlib函数可以捕捉按键事件而不丢失原始焦点吗?如何摆脱它?

(或"使用XGrabKey()而不生成抓取样式的焦点输出"?)

(或"如何在系统级摆脱NotifyGrab和NotifyUngrab焦点事件?"

XGrabKey将在按下键时失go 焦点,并在释放键时恢复焦点.

我想在不泄漏到原始窗口的情况下捕获按键(就像XGrabKey可以做的那样).

参考资料:

  1. ...XGrabKey会偷走焦点...

  2. ...程序接受控制,根据组合键执行某些操作.同时,该项目暂时集中在...

  3. ...XGrabKeyboard函数主动获取键盘控制,并生成FocusIn和FocusOut事件...

  4. ...我什么都看不见

  5. ...如果FocusOut事件具有NotifyGrab...

  6. 抓取键盘不允许改变焦点...

  7. 聚焦抓取生成的事件(XGrabKeyboard的主动抓取和XGrabKey的被动抓取)

  8. XGrabKey源代码:http://cgit.freedesktop.org/xorg/lib/libX11/tree/src/GrKey.c也许我们可以修改它来摆脱焦点事件?

  9. there is "DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);" in ActivateKeyboardGrab(): http://cgit.freedesktop.org/xorg/xserver/tree/dix/events.c

我正在编写一个一键对键组合(和鼠标移动)映射软件:https://code.google.com/p/diyism-myboard/

我用RegisterHotKey()和UnRegisterHotKey()在Windows中实现了它:https://code.google.com/p/diyism-myboard/downloads/detail?name=MyBoard.pas

我想用XGrabKey()和XUngrabKey()将其迁移到Linux中:https://code.google.com/p/diyism-myboard/downloads/detail?name=myboard.py

我创造了10美元的赏金来解决这个问题.我们需要更多的支持者来发放 prize .

推荐答案

最后,正如大家所知,linux意味着自由,我修改了xserver以摆脱grab风格的focusout:

sudo apt-get build-dep xorg-server
apt-get source xorg-server
cd xorg-server-*
#modify or patch dix/events.c: comment off "DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);" in ActivateKeyboardGrab(), comment off "DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);" in DeactivateKeyboardGrab()
sudo apt-get install devscripts
debuild -us -uc    #"-us -uc" to avoid the signature step
cd ..
sudo dpkg --install xserver-xorg-core_*.deb
#clear dependencies:
sudo apt-mark auto $(apt-cache showsrc xorg-server | grep Build-Depends | perl -p -e 's/(?:[\[(].+?[\])]|Build-Depends:|,|\|)//g')
sudo apt-get autoremove

我还需要go 掉gtk上下文菜单中的XGrabKeyboard:

sudo apt-get build-dep gtk+2.0
apt-get source gtk+2.0
cd gtk+2.0-*
#modify or patch it: add "return TRUE;" in first line of popup_grab_on_window() of gtk/gtkmenu.c
dpkg-source --commit
debuild -us -uc  #"-us -uc" to avoid the signature step, maybe need: sudo apt-get install devscripts
cd ..
sudo dpkg --install libgtk2.0-0_*.deb
#clear dependencies:
sudo apt-mark auto $(apt-cache showsrc gtk+2.0 | grep Build-Depends | perl -p -e 's/(?:[\[(].+?[\])]|Build-Depends:|,|\|)//g')
sudo apt-get autoremove

现在是我的董事会.py工作得很好.

如果您使用的是ubuntu raring updates edition,您可以try :

https://code.google.com/p/diyism-myboard/downloads/detail?name=xserver-xorg-core_1.13.3-0ubuntu6.2_i386.deb

以及:

https://code.google.com/p/diyism-myboard/downloads/detail?name=libgtk2.0-0_2.24.17-0ubuntu2_i386.deb

Linux相关问答推荐

Bash脚本用于在远程工作后关闭用户会话

使用sed或awk映射自定义和任意函数

无法在Raspberry PI 3 Model B上分配256TB的虚拟内存

C++调试器如何知道如何在源代码和可执行文件之间映射行?

在查找命令中使用 printf

使用正则表达式捕获特定字符串

如何在bash中用另一个整数变量增加一个整数变量?

删除 csv 列中的不匹配值

Linux 系统调用文档

PHP factor 30 从 Linux 到 Windows 的性能差异

使用 awk 或 sed 删除特定字符

Java 8 上的 SQL Server JDBC 错误:驱动程序无法使用安全套接字层 (SSL) 加密建立与 SQL Server 的安全连接

什么是最有效的不区分大小写的 grep 用法?

如何从命令行打开 Ubuntu Linux 上的 AVD 管理器?

是否有一个 linux 命令来确定与给定进程 ID 关联的窗口 ID?

使用 C++ 和 Linux 的高分辨率计时器?

如何使用 Linux 命令找到我的 shell 版本?

在linux上上几个目录

为嵌入式 Linux 设备实施更新/升级系统

学习内核编程