我有一个USB控制器,试图从Microsoft®SideWinder®即插即用游戏键盘上获取输入。我在尝试弄清楚如何正确接收其输入时遇到困难。不幸的是,我不能使用pygame,因为它需要一个窗口来接收输入,但是我必须生成一个pyglet窗口(通过PsychoPy)来运行我的程序。使用pygame,它可以连接并显示按钮的状态,但是如果不创建窗口,它就无法接收输入。我尝试寻找其他库,但是遇到的只是Inputs,它与我的控制器不兼容(安装后未检测到设备)。我已经使用在线游戏手柄测试仪对其进行了测试,因此控制器本身可以正常工作。 PsychoPy的操纵杆API当前已损坏,无法正常工作,因此也没有运气。
我真的希望有人对如何将控制器/游戏手柄的输入接收到程序中提出建议?
对于Windows,您可以直接使用WINMM.dll。
使用ctypes库加载dll(请参阅Loading shared libraries。使用ctypes.WINFUNCTYPE
创建该函数的原型:
ctypes.WINFUNCTYPE
joyGetNumDevs
joyGetDevCapsW
创建代表DLL的python函数joyGetDevCapsW
,joyGetPosEx
和joyGetPosEx
。并分别为类型import ctypes
winmmdll = ctypes.WinDLL('winmm.dll')
# [joyGetNumDevs](https://docs.microsoft.com/en-us/windows/win32/api/joystickapi/nf-joystickapi-joygetnumdevs)
"""
UINT joyGetNumDevs();
"""
joyGetNumDevs_proto = ctypes.WINFUNCTYPE(ctypes.c_uint)
joyGetNumDevs_func = joyGetNumDevs_proto(("joyGetNumDevs", winmmdll))
# [joyGetDevCaps](https://docs.microsoft.com/en-us/windows/win32/api/joystickapi/nf-joystickapi-joygetdevcaps)
"""
MMRESULT joyGetDevCaps(UINT uJoyID, LPJOYCAPS pjc, UINT cbjc);
32 bit: joyGetDevCapsA
64 bit: joyGetDevCapsW
sizeof(JOYCAPS): 728
"""
joyGetDevCaps_proto = ctypes.WINFUNCTYPE(ctypes.c_uint, ctypes.c_uint, ctypes.c_void_p, ctypes.c_uint)
joyGetDevCaps_param = (1, "uJoyID", 0), (1, "pjc", None), (1, "cbjc", 0)
joyGetDevCaps_func = joyGetDevCaps_proto(("joyGetDevCapsW", winmmdll), joyGetDevCaps_param)
# [joyGetPosEx](https://docs.microsoft.com/en-us/windows/win32/api/joystickapi/nf-joystickapi-joygetposex)
"""
MMRESULT joyGetPosEx(UINT uJoyID, LPJOYINFOEX pji);
sizeof(JOYINFOEX): 52
"""
joyGetPosEx_proto = ctypes.WINFUNCTYPE(ctypes.c_uint, ctypes.c_uint, ctypes.c_void_p)
joyGetPosEx_param = (1, "uJoyID", 0), (1, "pji", None)
joyGetPosEx_func = joyGetPosEx_proto(("joyGetPosEx", winmmdll), joyGetPosEx_param)
和joyGetNumDevs
创建类:
joyGetDevCaps
请参见简单示例以测试api:
joyGetPosEx
[api绑定和示例在GitHub存储库JOYCAPS
中提供