關於 Linux 中模擬滑鼠

jeefy發表於2024-03-09

問題的背景是我想用自動化指令碼來玩 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 中。

相關文章