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