捕获发送到Linux中特定应用程序的密钥

问题描述

理想情况下,我想捕获发送到特定程序(并且仅限该程序的 )的密钥。矮人要塞。 [然后将击键仅发送到该程序-这样做更容易]

一种解决方法是在Docker或VM中运行该应用程序,并使用[logkeys][1]之类的内容捕获所有击键,但最好为特定应用程序使用包装器或其他方法

我正在寻求解决此问题的解决方案。 我应该使用设备驱动程序吗? (但是我如何将其限制为仅该应用程序呢?)或者我应该注意一些特定的东西,例如Python / C已经拥有了……为什么不只使用keytrace等?

编辑:经过进一步的思考,这似乎是在窗口管理器级别处理的东西-也许是一种方法

解决方法

如果您的应用程序创建了X11窗口,或者在X11窗口中运行(例如终端仿真器中的 ),则可以捕获针对该特定窗口的X11事件。

运行应用程序后,使用xwininfo确定窗口的标识符:运行xwininfo,单击目标窗口,然后查找

xwininfo: Window id: ...

在输出中。

然后运行xev,拦截发送到目标窗口的事件:

xev -id ... -event keyboard

...替换为上面确定的窗口ID。

结果相当冗长,但是可以进行后处理:

KeyPress event,serial 18,synthetic NO,window 0x4000003,root 0x187,subw 0x0,time 141181493,(369,-10),root:(369,54),state 0x0,keycode 116 (keysym 0xff54,Down),same_screen YES,XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event,serial 21,time 141181653,XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event,time 141182188,XLookupString gives 0 bytes: 
    XFilterEvent returns: False

这不适用于所有X11应用程序,但适用于Dwarf Fortress。

在X11下,窗口管理器不处理单个应用程序的键盘输入。