最近打游戏累了
想自动化打游戏
最开始是打算模拟键鼠方案的,但是吧,很快就遇到了问题。
对于常规的窗口来讲,ctypes库足以模拟键鼠输入了
但是进到第三人称视角的游戏里面吧,键盘模拟还好说,鼠标移动他视角不动啊
这就很令人头疼了。
我又检测了一下鼠标的位置,发现鼠标的坐标其实一直锁定在窗口的正中心。
也就是说游戏检测鼠标移动来调整视角是不能通过脚本让鼠标向某个坐标移动来实现的。
可能可以从更底层的驱动来模拟鼠标运动进而实现这个操作,但是我决定何不用一个更简单的方法——模拟手柄。

自动化手柄操作

vjoy

网上搜了一下,第一个考虑用的vjoy
python需要用的库是pyvjoy 当然还需要搭配一个测试工具来看我设置手柄对不对
测试工具

import pyvjoy
MAX_VJOY = 32767

j = pyvjoy.VJoyDevice(1)
for i in range(0x1,0x8000):
    
    j.set_axis(pyvjoy.HID_USAGE_X, i)

运行后发现

Unable to load vJoy SDK DLL.  Ensure that vJoyInterface.dll is present

回去看github页面发现

Currently vJoyInterface.dll is looked for inside the pyvjoy directory only so place the desired version of that file there to use. (Note: this library currently only works with the x86 dll!)

也就是说需要把dll放在pyvjoy的目录下,注意是pyvjoy的目录下,不是新写的代码的目录下。

python如何绑htc vive手柄 python模拟手柄_摇杆


此时再运行刚才的代码,可以在测试工具中看到摇杆的移动

python如何绑htc vive手柄 python模拟手柄_重启_02


进入一下debug模式,让他停在这里打开steam的控制器页面可以看到已经检测到了vjoy手柄

python如何绑htc vive手柄 python模拟手柄_python_03


python如何绑htc vive手柄 python模拟手柄_重启_04


通过set_axis可以让steam把摇杆识别出来。看来问题不大

但是啊,这个时候我就又遇到问题了,那就是vjoy这玩意他只有一个摇杆啊,我要设置右摇杆怎么办呢?
呜。。。
好像还是有解决办法,但是秉着不要重复造轮子的思想,毕竟时间有限每天还要正经工作还要打游戏,于是我又去找有没有什么直接模拟XBOX360或者XBOX ones手柄的方法,反正你得给我来个XINPUT对吧。

然后我就发现了一个东西,vgamepad

vgamepad

vgamepad是用来模拟XBox360 gamepad的,说明文档也比长久不更新的pyvjoy详细很多。

当然了,这个东西只支持windows。

如果你和我一样尝试在mac上通过pip安装,就会出现下面的情况。

python如何绑htc vive手柄 python模拟手柄_摇杆_05


windows就好说了,安装好然后重启。(他会自动给你安装viGem的,然后要求你重启)

我们打开一个xbox控制器测试软件来试试看。

python如何绑htc vive手柄 python模拟手柄_重启_06


最开始是没插手柄的,然后我们创建一个手柄

import vgamepad as vg

gamepad = vg.VX360Gamepad()

gamepad.press_button(button=vg.XUSB_BUTTON.XUSB_GAMEPAD_DPAD_LEFT)  # press the left hat button

gamepad.update()  # send the updated state to the computer

# (...) A and left hat are pressed...

gamepad.release_button(button=vg.XUSB_BUTTON.XUSB_GAMEPAD_A)  # release the A button

gamepad.update()  # send the updated state to the computer

# (...) left hat is still pressed...
while 1:
    pass

python如何绑htc vive手柄 python模拟手柄_python如何绑htc vive手柄_07


python如何绑htc vive手柄 python模拟手柄_摇杆_08

python如何绑htc vive手柄 python模拟手柄_测试工具_09


python如何绑htc vive手柄 python模拟手柄_重启_10

脚本结束后这个设备会被拔出,然后就检测不到手柄了。
目前看来这个手柄的方案应该能用。