关于 Linux 中模拟鼠标

问题的背景是我想用自动化脚本来玩 Stardew Valley 的小游戏,刷钱,但是遇到了一系列问题,这里记录我的一些历程。

pyautogui/pydirectinput

pyautogui 是我第一个考虑的方案。虽然可以正常的移动鼠标,点击,但是游戏内却没有点击事件。

搜索发现一般游戏在 windows 下使用的是 directX,所以我尝试在 windows 下使用 pydirectinput 写脚本,但是仍然游戏内没有点击事件。

由于我常用 Linux,所以转战更了解的 Linux

uinput

这是我搜索 Linux 模拟鼠标事件 出来的第一眼可行的方案。

参考已有的脚本,写出来,还是在游戏内部无法检测。

谷歌搜索没有解决方法,疑似是 steam 内单独将 uinput 的虚拟设备给屏蔽掉了。

xdotool

这是在 X 环境下的一个模拟用户输入事件的工具。

但是还是老问题。


由于鼠标本身事件可行,考虑直接利用已有的鼠标进行操作。

evemu

event emulator 是一个基于 libevdev 控制事件的小工具。

测试发现合理。

观察源代码,发现只是将 uinputdevHandler 换成 /dev/input/eventX(物理鼠标事件文件)即可。

手写一遍,问题依旧。

观察事件时间,发现当鼠标点击时间不超过 \(\approx 60ms\) 时,游戏会忽略这个事件。

增加间隔为 \(100ms\),成功。

增大间隔,尝试重新利用 uinput,无用。应该确实是屏蔽了 uinput 的原因。


所写源代码以及尝试放在 jeefies/autoclick 中。

posted @ 2024-03-09 21:55  jeefy  阅读(137)  评论(0编辑  收藏  举报