问题描述
理想情况下,我想捕获发送到特定程序(并且仅限该程序的 )的密钥。矮人要塞。 [然后将击键仅发送到该程序-这样做更容易]
一种解决方法是在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下,窗口管理器不处理单个应用程序的键盘输入。