关于 Linux 中模拟鼠标
问题的背景是我想用自动化脚本来玩 Stardew Valley 的小游戏,刷钱,但是遇到了一系列问题,这里记录我的一些历程。
pyautogui/pydirectinput
pyautogui
是我第一个考虑的方案。虽然可以正常的移动鼠标,点击,但是游戏内却没有点击事件。
搜索发现一般游戏在 windows
下使用的是 directX
,所以我尝试在 windows
下使用 pydirectinput
写脚本,但是仍然游戏内没有点击事件。
由于我常用 Linux
,所以转战更了解的 Linux
uinput
这是我搜索 Linux 模拟鼠标事件
出来的第一眼可行的方案。
参考已有的脚本,写出来,还是在游戏内部无法检测。
谷歌搜索没有解决方法,疑似是 steam
内单独将 uinput
的虚拟设备给屏蔽掉了。
xdotool
这是在 X
环境下的一个模拟用户输入事件的工具。
但是还是老问题。
由于鼠标本身事件可行,考虑直接利用已有的鼠标进行操作。
evemu
event emulator
是一个基于 libevdev
控制事件的小工具。
测试发现合理。
观察源代码,发现只是将 uinput
的 devHandler
换成 /dev/input/eventX
(物理鼠标事件文件)即可。
手写一遍,问题依旧。
观察事件时间,发现当鼠标点击时间不超过 \(\approx 60ms\) 时,游戏会忽略这个事件。
增加间隔为 \(100ms\),成功。
增大间隔,尝试重新利用 uinput
,无用。应该确实是屏蔽了 uinput
的原因。
所写源代码以及尝试放在 jeefies/autoclick 中。