![在命令行上操作 X 键和指针抓取](https://linux22.com/image/10797/%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8A%E6%93%8D%E4%BD%9C%20X%20%E9%94%AE%E5%92%8C%E6%8C%87%E9%92%88%E6%8A%93%E5%8F%96.png)
有哪些命令行工具可以列出和管理 X 服务器抓取? (这就像键和指针抓取一样,即限制对特定应用程序使用特定的键或鼠标按钮,或者限制鼠标指针保留在特定的屏幕区域。)我正在寻找一个假设的xgrab
实用程序,它可以显示类似的东西
Key 0x00f00ba5 0x123 0
Button 0x00f00ba5 2
Pointer 0x00abcdef
表示已调用XGrabKey(display, 0x123, 0, 0x00f00ba5, ...)
, XGrabButton
, XGrabPointer
, XGrabKeyboard
(XGrabServer
如果可能)。显示格式并不重要,我想要的是某种方式来查看谁在抓取什么,并且可能有某种方式撤销这些抓取(如果可能的话,我不确定 X11 API 是否允许这样做)。
答案1
最新版本的 X(X.org 服务器 ≥1.11)支持多种调试键盘符号,在这次提交。触发后,它们会执行与抓取相关的操作。
默认情况下 (至少在最近的版本中),这些被禁用(默认键盘映射中不存在)。
不过,如果你已经xdotool
安装了,是可以通过在命令行上执行来调用它们:
xdotool key NameOfKey
NameOfKey
您要激活的键盘符号在哪里。例如,要将活动抓取列表打印到 X 服务器日志,请使用xdotool key XF86LogGrabInfo
。
相关按键符号是:
- XF86LogGrabInfo:将活动抓取列表打印到 X 服务器日志
- XF86Ungrab:中断所有活动的抓取,而不杀死持有抓取的应用程序
- XF86ClearGrab:杀死所有持有主动抓取的进程
请注意,XF86LogGrabInfo仅列出主动抓取,而不列出被动抓取,例如抓取当前未按下的键。如果您想获取有关被动抓取的信息,则需要激活抓取:按下xdotool key XF86LogGrabInfo
您感兴趣的键和弦或鼠标按钮组合时运行。做类似的事情:
- 跑步
sleep 1; xdotool key XF86LogGrabInfo
- 在 1 秒内,按下琴键或鼠标按键组合。
- 1 秒后,松开按键/按钮。
- 检查 X 服务器日志中的“主动抓取…”信息(经常
/var/log/Xorg.0.log
)。
答案2
我不知道可能存在的单个按键或按钮的被动抓取1 的任何即时信息,但有几种方法可以列出整个键盘或鼠标设备的主动抓取。
- 在所有平台上,但仅限 Xorg 1.11 及更高版本(或应用了补丁的旧版本),映射热键以将抓取数据转储到日志中,如下所示这些补丁说明中描述。
- 在 Solaris 11(Solaris 11 Express 2010.11 或实际的 Solaris 11 发行版)上,使用调试器脚本,例如
/usr/demo/Xserver/mdb/list_Xserver_devicegrab_client
,如从 X 服务器获取信息。这里还有一个用于服务器抢夺的功能,Xorg 1.11 热键当前未涵盖。
1见http://tronche.com/gui/x/xlib/input/pointer-grabbing.html用于定义主动与被动抓取。
答案3
这是对机械蜗牛答案的补充——
Xorg 日志中的条目可能非常难以辨认。我编写了一个程序来解析它们并以人类易于处理的形式呈现它们:
https://gist.github.com/CyberShadow/6412d11aea64144f8905cc0b8196f38e
要使用,首先运行xdotool key XF86LogGrabInfo
,如 Mechanical snail 的答案中所述。然后,运行上面链接的程序。如果您的 Xorg 日志文件不位于/var/log/Xorg.0.log
,您可以使用--xorg-log
选项指定其位置。--help
详情请参阅。
答案4
根据上面的答案,以下命令帮助我识别所有获取键盘快捷键的程序:
$ lsof -c Xorg | grep ".log" # find out the path for the Xorg log file
Xorg 16025 sr 4w REG 254,1 225839 3933229 /home/sr/.local/share/xorg/Xorg.0.log
$ xdotool key XF86LogGrabInfo # prints all Xorg registered grabs
$ cat /home/sr/.local/share/xorg/Xorg.0.log | grep grabs
[ 39303.019] (II) Printing all currently active device grabs:
[ 39303.019] (II) End list of active device grabs
[ 39303.019] Printing all currently registered grabs
[ 39303.019] Printing all registered grabs of client pid 16024 xinit /home/sr/.xinitrc -- /etc/X11/xinit/xserverrc :0 vt1 -keeptty -auth /tmp/serverauth.6AO52I3zhe
[ 39303.019] Printing all registered grabs of client pid 16045 unclutter
[ 39303.019] Printing all registered grabs of client pid 16047 xscreensaver
[ 39303.019] Printing all registered grabs of client pid 16109 /usr/lib/firefox/firefox
[ 39303.019] Printing all registered grabs of client pid 16055 xscreensaver-systemd
[ 39303.019] Printing all registered grabs of client pid 16057 xbindkeys
[ 39303.027] Printing all registered grabs of client pid 16039 /usr/bin/openbox --startup /usr/lib/openbox/openbox-autostart OPENBOX
[ 39303.039] Printing all registered grabs of client pid 16048 copyq
[ 39303.039] Printing all registered grabs of client pid 16049 konsole
[ 39303.039] Printing all registered grabs of client pid 16095 /usr/bin/copyq --clipboard-access monitorClipboard
[ 39303.039] Printing all registered grabs of client pid 16109 /usr/lib/firefox/firefox
[ 39303.039] Printing all registered grabs of client pid 16456 subl --detached
[ 39303.039] Printing all registered grabs of client pid 16465 /usr/lib/at-spi2-registryd --use-gnome-session
[ 39303.039] Printing all registered grabs of client pid 17178 xdotool key XF86LogGrabInfo
[ 39303.039] End list of registered passive grabs
所以在我的例子中,以下应用程序正在获取按键绑定:xinit、unclutter、xscreensaver、firefox、xbindkeys、openbox、copyq、konsole、subl、at-spi2-registryd