在命令行上操作 X 键和指针抓取

Gil*_*il' 25 command-line keyboard x11 mouse

有哪些命令行工具可以列出和管理 X 服务器抓取?(这就像在键和指针抓取中一样抓取,即将特定键或鼠标按钮的使用限制到特定应用程序,或将鼠标指针限制在特定屏幕区域中。)我正在寻找一种假设的xgrab实用程序显示诸如

Key     0x00f00ba5  0x123   0
Button  0x00f00ba5  2       
Pointer 0x00abcdef  
Run Code Online (Sandbox Code Playgroud)

意味着已经XGrabKey(display, 0x123, 0, 0x00f00ba5, ...)使用XGrabButton, XGrabPointer, XGrabKeyboard, XGrabServer(如果可能)调用了等等。显示格式无关紧要,我想要的是某种方式来查看谁在抓取什么,以及可能以某种方式撤销这些抓取(如果可能,我不确定 X11 API 是否允许这样做)。

Mec*_*ail 31

最新版本的 X(X.org 服务器?1.11)支持几个调试键符,在这个提交中引入。触发时,这些会执行与抓取相关的操作。

默认情况下(至少在最近的版本中),这些是禁用的(默认键盘映射中没有)。

但是,如果您已xdotool安装,可以通过在命令行上执行来调用它们:

xdotool key NameOfKey
Run Code Online (Sandbox Code Playgroud)

NameOfKey您要激活的键符在哪里。例如,要将活动抓取列表打印到 X 服务器日志,请使用xdotool key XF86LogGrabInfo.

相关的键符是:

请注意,XF86LogGrabInfo仅列出主动抓取,而不是被动抓取,例如抓取当前未按下的键。如果您想获取有关被动抓取的信息,您需要激活抓取:xdotool key XF86LogGrabInfo按下您感兴趣的键和键或鼠标按钮组合时运行。做类似的事情:

  1. sleep 1; xdotool key XF86LogGrabInfo
  2. 在 1 秒内,按下琴键或鼠标按钮组合。
  3. 1 秒后,松开按键/按钮。
  4. 检查 X 服务器日志中的“主动抓取……”信息(通常是/var/log/Xorg.0.log)。

  • @Gilles - 不,如果你这样运行它,你将不会得到任何输出......尝试使用 `sleep 2; 运行它;xdotool 键“XF86LogGrabInfo”` 并立即开始非常快速地按下一个键(例如“Win”键),然后您将在 Xorg.log 中看到一些输出。或者使用`xdotool`同时按下键+`XF86LogGrabInfo`,比如[这里](http://askubuntu.com/a/406907) (4认同)
  • 现在在带有 Xorg 1.12.4 的 Debian wheezy 上进行测试,`xdotool key XF86LogGrabInfo` 只触发 X 日志中的两个条目:“打印所有当前活动的设备抓取:”紧接着是“活动设备抓取的结束列表”。然而我的窗口管理器确实抓住了一堆钥匙。你见过这个用于抓取钥匙的工作吗? (2认同)

ala*_*anc 8

对于可能存在的单个键或按钮的被动抓取1,我一无所知,但有几种方法可以列出整个键盘或鼠标设备的主动抓取。

  1. 在所有平台上,但仅限 Xorg 1.11 及更高版本(或应用了补丁的旧版本),映射热键以将抓取数据转储到日志,如这些补丁说明 中所述
  2. 在 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


Vla*_*eev 5

这是对机械蜗牛的回答的补充——

Xorg 日志中的条目可能非常难以辨认。我编写了一个程序来解析它们并以人类易于处理的形式呈现它们:

https://gist.github.com/Cyber​​Shadow/6412d11aea64144f8905cc0b8196f38e

要使用,首先运行xdotool key XF86LogGrabInfo,如机械蜗牛的回答中所述。然后,运行上面链接的程序。如果您的 Xorg 日志文件不在/var/log/Xorg.0.log,您可以使用该--xorg-log选项指定其位置。详情请参阅--help

  • 这里提到的要点是用语言 D 编程的。要获得可执行文件,可以安装包 `gdc`(GNU D 编译器)和 `libx11-dev`,然后运行 ​​`gdc -o xorg-show-grabs xorg-show-grabs .d -lX11`。 (3认同)