如何模拟操纵杆或游戏手柄按钮?

时间:2013-10-18 09:28:28

标签: windows autoit

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

1 个答案:

答案 0 :(得分: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