使用 evemu 模拟设备输入

正在寻找一种模拟键盘和鼠标输入的方法? 网络上到处都是提到 xdotool 的各种指南和教程,“命令行 X11 自动化工具”。 xdotool 模拟 X11 输入事件; 它甚至可以移动或调整桌面窗口的大小。

不幸的是,顾名思义,xdotool 只适用于 X11 窗口系统。 这意味着由于 Wayland 协议定义的更严格的安全约束,它无法在 Wayland 会话中工作。 xdotool 提供的功能仍然是无价的。 幸运的是,有一组实用程序可以提供与 xdotool 非常相似的功能。 因为它通过直接模拟输入设备来工作,所以 evemu 可以在 Wayland 会话和 X11 桌面会话中工作。

Evemu 不是 xdotool 的直接替代品,也不是它的设计初衷。 为了 example,它没有类似mousemove的功能。 相反,evemu 记录设备输入事件。 仔细研究输出和事件序列的修改将产生所需的模拟事件。 本文将介绍 evemu 并演示如何使用它来模拟输入事件,就像 xdotool 所做的那样。

安装

evemu 在 Fedora 存储库,因此安装很简单:

sudo dnf install evemu

列出设备

首先,通过查看 /dev/input/by-id/ 和 /dev/input/by-path/ 来查看系统上存在哪些设备。 或者,evemu-describe 命令将枚举每个连接设备的事件:

$ sudo evemu-describe
Available devices:
/dev/input/event0: Power Button
/dev/input/event1: Sleep Button
/dev/input/event2: AT Translated Set 2 keyboard
/dev/input/event3: ImExPS/2 Generic Explorer Mouse
/dev/input/event4: VirtualBox USB Tablet
/dev/input/event5: Video Bus
/dev/input/event6: VirtualBox mouse integration
Select the device event number [0-6]: 3
...
# Supported events:
#   Event type 0 (EV_SYN)
#     Event code 0 (SYN_REPORT)
#     Event code 1 (SYN_CONFIG)
#     Event code 2 (SYN_MT_REPORT)
#     Event code 3 (SYN_DROPPED)
#     Event code 4 ((null))
#     Event code 5 ((null))
#     Event code 6 ((null))
#     Event code 7 ((null))
#     Event code 8 ((null))
#     Event code 9 ((null))
#     Event code 10 ((null))
#     Event code 11 ((null))
#     Event code 12 ((null))
#     Event code 13 ((null))
#     Event code 14 ((null))
#     Event code 15 (SYN_MAX)
#   Event type 1 (EV_KEY)
#     Event code 272 (BTN_LEFT)
#     Event code 273 (BTN_RIGHT)
#     Event code 274 (BTN_MIDDLE)
#     Event code 275 (BTN_SIDE)
#     Event code 276 (BTN_EXTRA)
#   Event type 2 (EV_REL)
#     Event code 0 (REL_X)
#     Event code 1 (REL_Y)
#     Event code 6 (REL_HWHEEL)
#     Event code 8 (REL_WHEEL)
...

老鼠

在这种情况下,/dev/input/event3 是鼠标。 通过运行记录其输入事件:

$ sudo evemu-record --autorestart=3 /dev/input/event3 /tmp/mouse
^C$

此命令创建一个名为 /tmp/mouse. 的文件。 在 3 秒不活动(自动重启选项)后,将创建一个带有新时间戳后缀的新文件。 按 CTRL+C 停止录制。 现在通过运行 evemu-play 来运行录制:

$ sudo evemu-play /tmp/mouse.<timestamp>
ImExPS/2 Generic Explorer Mouse: /dev/input/event7
Hit enter to start replaying

光标应以类似于录制过程中的移动模式在屏幕上移动。 请注意,坐标不是相对于桌面,而是相对于输入设备。 运动将从 当前位置 光标的位置,而不是记录期间光标所在的位置。

这 example 可能看起来是多余的。 使用键盘会产生更实际的用例。 事实上,模拟击键更容易; 键盘没有使鼠标仿真如此具有挑战性的坐标系。

键盘

在这台机器上,键盘是 /dev/input/event2。 请记住,它的所有事件都可以使用 evemu-describe /dev/input/event2 列出。 这 example 模拟按下 Super。 在 GNOME 中,这会显示活动概览:

$ sudo -- bash -c 'evemu-event /dev/input/event2 --type EV_KEY --code KEY_LEFTMETA --value 1 --sync; evemu-event /dev/input/event2 --type EV_KEY --code KEY_LEFTMETA --value 0 --sync'

请注意,evemu-event 命令重复了两次。 第一次将 value 选项设置为 1。这模拟了按键按下事件。 第二次将值设置为 0。这模拟了按键事件。 记得松开按键,否则就像按键被卡住一样! 最后,同步选项保证按键按顺序执行。

将所有这些放在一起,创建一个简单的 bash 启动 LibreOffice Writer 的脚本。 脚本按 Super 键,键入“writer”,然后按 Enter. 为了演示,脚本在击键和事件之间添加了一个暂停,将使用退格键删除错字。 请务必将设备替换为您自己机器上的键盘设备。

#!/bin/bash

device="/dev/input/event2"

function press {
evemu-event ${device} --type EV_KEY --code $1 --value 1 --sync
evemu-event ${device} --type EV_KEY --code $1 --value 0 --sync
sleep 0.2
}

press KEY_LEFTMETA
sleep 1
press KEY_W
press KEY_R
press KEY_I
press KEY_T

# Typo!
press KEY_I
press KEY_E

# Let's fix that
press KEY_BACKSPACE
press KEY_BACKSPACE

press KEY_E
press KEY_R

sleep 1
press KEY_ENTER

使用 chmod 设置执行位并执行它(使用 sudo): sudo ./script.sh

不管其最初的目的是什么,只要有一些想象力,evemu 都可以被巧妙地利用:信息亭或现场演示,对你的室友恶作剧,或者与一些硬件(如 Arduino 或 micro:bit)结合使用自制遥控器.