如何拦截所有击键

如何拦截所有击键

首先,我不认为这样的事情已经存在,但我有兴趣知道如何实现这样的事情。

我想要一个可以在后台运行的程序,它可以拦截输入的所有击键(我假设 X 正在运行,甚至 Unity 也在运行),处理这些击键,然后发送原始或修改后的击键进行正常处理。

我的最终目标是创建一种更接近模仿 OS X 快捷键行为的键映射。对于标准 Ubuntu 安装来说,这非常困难,因为 ctrl+c 之类的操作似乎是固定不变的,而要模仿 OS X 行为,则需要 cmd+c。无论如何,我对讨论为什么不太感兴趣,而对讨论如何更感兴趣。我并不反对用 Python、C 或其他可能需要的语言编写守护进程(我对标准 UNIX api 也比较熟悉)。但是,我完全不知道从哪里开始做这样的事情。

当按键被拦截和处理后,它应该能够按照与按键最初发送时相同的接口将它们发送回操作系统。也许这必须是 X 本身的一个补丁?或者键盘和 X 之间能有某种东西吗?

答案1

要显示来自键盘以及其他输入设备的事件,还有evtest
它本身不能创建按键,但请参见下文。

xev例如,它以比实际情况更低的级别显示事件。

此外,它还显示了设备可以创建哪些事件。

恰巧,event4指的是我的主键盘。

因此我使用命令创建下面的示例输出

sudo evtest /dev/input/event4

并按下aB

[ ... ]
Event: time 1429316964.681508, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70004
Event: time 1429316964.681508, type 1 (EV_KEY), code 30 (KEY_A), value 1
Event: time 1429316964.681508, -------------- SYN_REPORT ------------
aEvent: time 1429316964.761540, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70004
Event: time 1429316964.761540, type 1 (EV_KEY), code 30 (KEY_A), value 0
Event: time 1429316964.761540, -------------- SYN_REPORT ------------
Event: time 1429316965.385461, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time 1429316965.385461, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 1
Event: time 1429316965.385461, -------------- SYN_REPORT ------------
Event: time 1429316965.577461, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70005
Event: time 1429316965.577461, type 1 (EV_KEY), code 48 (KEY_B), value 1
Event: time 1429316965.577461, -------------- SYN_REPORT ------------
BEvent: time 1429316965.641460, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70005
Event: time 1429316965.641460, type 1 (EV_KEY), code 48 (KEY_B), value 0
Event: time 1429316965.641460, -------------- SYN_REPORT ------------
Event: time 1429316965.713470, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e1
Event: time 1429316965.713470, type 1 (EV_KEY), code 42 (KEY_LEFTSHIFT), value 0
[ ... ]


(要找到正确的事件编号(例如我的事件 4),您可以查看cat /proc/bus/input/devicesName可能不是指键盘,但请查找Handlers包含sysrq kbd和的条目leds。或者全部尝试。)



无法通过 创建按键事件evdev,但可以使用 实现按键重新映射evdev,从而创建新的事件,
它似乎与您正在寻找的内容相匹配:

Evdev 的家庭修改器ahm或者at-home-modifier-evdev):

例如,它可以启用“Space/Shift 双重功能键”。当您单独按下 Space 键时,它就是空格键;但是当您同时按下该键和另一个键时,它就是 Shift 键。例如,大致来说,space + x = X。

任何按键组合都是可行的。例如,除了 Space/Shift 之外,您还可以将左 Alt 变成 BS/Alt。在此示例中,Space 后跟 LAlt 会发送 Shift + BS,LAlt 后跟 Space 会发送 Alt + Space,Space + LAlt + x 和 LAlt + Space + x 会发送 Alt + Shift + x。

它是 Xorg“evdev”驱动程序的一个分支 [...]

它并不声称是一个干净的实现 - 但这并不妨碍从中学习。

答案2

是的,有一个适用于 ubuntu 的键盘记录器。

你可以在这里下载

或者通过 apt-get 安装

启用 Universe 存储库,然后在终端中运行以下命令

sudo aptitude update
sudo aptitude install lkl

要运行,请在终端中输入以下内容

lkl -l -k us_km -o log.file

为了看到结果

尾部日志文件

答案3

如果十多年后仍有人寻找这个问题的答案,那么自 2019 年以来,有一种东西叫做柯莫纳德这正是 OP 想要的:它拦截键盘输入并允许您配置如何将它们发送到系统。

相关内容