You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过USB HID API获取超32键游戏控制器的输入数据?

问题:读取超过32键的游戏控制器数据

我之前使用joyGetPosEx API获取游戏控制器数据一直正常,但新购入的控制器按键数超过了该API支持的32键上限——连Windows自带的游戏控制器控制面板小程序都无法显示全部按键!

对应的API声明代码:

Public Declare Function joyGetPosEx Lib "winmm.dll" (ByVal uJoyID As Long, pji As JOYINFOEX) As Long

我拥有一个可根据厂商ID/产品ID向任意USB设备发送最多65字节数据的API,仅需知晓需发送的字节内容即可使用,但找不到此类底层通信的文档。

我无法使用DirectInput,因为这并非游戏程序,需要在后台运行且不影响控制器在游戏中的使用,同时也不想引入不必要的大型依赖。

对应的自定义读写设备API代码:

Public Function ReadAndWriteToDevice(MyVendorID As Long, MyProductID As Long, Optional Byte1 As Byte, Optional Byte2 As Byte, Optional Byte3 As Byte, Optional Byte4 As Byte, Optional Byte5 As Byte, Optional Byte6 As Byte, Optional Byte7 As Byte, Optional Byte8 As Byte, Optional ReadBytes As Long = 8, Optional Timeout_in_msec As Integer = 5000) As Byte()
    Dim i As Long
    Dim OutputReportData(65) As Byte
    Dim InputReportData(65) As Byte
    Dim RET() As Byte
    
    OutputReportData(1) = Byte1 ' 目前代码仅设置发送8字节,但改成最多65字节很容易
    OutputReportData(2) = Byte2
    OutputReportData(3) = Byte3
    OutputReportData(4) = Byte4
    OutputReportData(5) = Byte5
    OutputReportData(6) = Byte6
    OutputReportData(7) = Byte7
    OutputReportData(8) = Byte8
    
    If MyDeviceDetected = False Then
        MyDeviceDetected = FindTheHid(MyVendorID, MyProductID)
    End If
    
    If MyDeviceDetected Then
        Call WriteToHID(OutputReportData)
        If ReadFromHID(InputReportData, , Timeout_in_msec, False) = -1 Then Exit Function
    End If
    
    If ReadBytes > 64 Or ReadBytes < 1 Then
        ReadAndWriteToDevice = InputReportData
    Else
        ReDim RET(1 To ReadBytes)
        For i = 1 To ReadBytes
            RET(i) = InputReportData(i)
        Next i
        ReadAndWriteToDevice = RET 'InputReportData(1)
    End If
End Function

内容的提问来源于stack exchange,提问作者NeoTechni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:22:46