【问题标题】:How to simulate a joystick or gamepad -button press?如何模拟操纵杆或游戏手柄按钮按下?
【发布时间】:2022-01-17 03:24:38
【问题描述】:

如何使用 AutoIt 脚本模拟操纵杆或游戏手柄按钮按下?例如。按下 Xbox360 控制器上的按钮 A。

【问题讨论】:

    标签: windows autoit joystick gamepad


    【解决方案1】:

    试试这个:

    #include <GUIConstants.au3>
    
    Local $joy, $coor, $h, $s, $msg
    
    $joy = _JoyInit()
    GUICreate("Joystick Test", 300, 300)
    $h = GUICtrlCreateLabel("", 10, 10, 290, 290)
    GUISetState()
    
    While 1
        $msg  = GUIGetMsg()
        $coor = _GetJoy($joy, 0)
        $s    = "Joystick(0):" & @CRLF & _
                "X: " & $coor[0] & @CRLF & _
                "Y: " & $coor[1] & @CRLF & _
                "Z: " & $coor[2] & @CRLF & _
                "R: " & $coor[3] & @CRLF & _
                "U: " & $coor[4] & @CRLF & _
                "V: " & $coor[5] & @CRLF & _
                "POV: " & $coor[6] & @CRLF & _
                "Buttons: " & $coor[7]
        GUICtrlSetData($h, $s, 1)
        Sleep(10)
        If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd
    
    _JoyClose($joy)
    
    ;======================================
    ;   _JoyInit()
    ;======================================
    Func _JoyInit()
        Local $joy
        Global $JOYINFOEX_struct = "dword[13]"
    
        $joy = DllStructCreate($JOYINFOEX_struct)
        If @error Then Return 0
        DllStructSet($joy, 1, DllStructSize($joy), 1);dwSize = sizeof(struct)
        DllStructSet($joy, 1, 255, 2) ;dwFlags = GetAll
        Return $joy
    EndFunc
    
    ;======================================
    ;   _GetJoy($lpJoy,$iJoy)
    ;   $lpJoy  Return from _JoyInit()
    ;   $iJoy   Joystick # 0-15
    ;   Return  Array containing X-Pos, Y-Pos, Z-Pos, R-Pos, U-Pos, V-Pos,POV
    ;           Buttons down
    ;
    ;           *POV This is a digital game pad, not analog joystick
    ;           65535   = Not pressed
    ;           0       = U
    ;           4500    = UR
    ;           9000    = R
    ;           Goes around clockwise increasing 4500 for each position
    ;======================================
    Func _GetJoy($lpJoy, $iJoy)
        Local $coor, $ret
    
        Dim $coor[8]
        DllCall("Winmm.dll", _
                "int", "joyGetPosEx", _
                "int", $iJoy, _
                "ptr", DllStructPtr($lpJoy) _
        )
    
        If Not @error Then
            $coor[0] = DllStructGet($lpJoy, 1, 3)
            $coor[1] = DllStructGet($lpJoy, 1, 4)
            $coor[2] = DllStructGet($lpJoy, 1, 5)
            $coor[3] = DllStructGet($lpJoy, 1, 6)
            $coor[4] = DllStructGet($lpJoy, 1, 7)
            $coor[5] = DllStructGet($lpJoy, 1, 8)
            $coor[6] = DllStructGet($lpJoy, 1, 11)
            $coor[7] = DllStructGet($lpJoy, 1, 9)
        EndIf
    
        Return $coor
    EndFunc
    
    ;======================================
    ;   _JoyClose($lpJoy)
    ;   Free the memory allocated for the joystick struct
    ;======================================
    Func _JoyClose($lpJoy)
        DllStructFree($lpJoy)
    EndFunc
    

    More info here.

    【讨论】:

    • 嗨,我在问这个问题之前试过这个,这只是显示按下的按钮
    • @JatSing 我相信键盘上的每个按钮在键盘上都有它的按钮。您可以使用 ControlSend() 或 Send() 来实现这一点。
    • 不,我的情况很特殊。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多