Jump to content
Sign in to follow this  
Nologic

GamePad MouseMover

Recommended Posts

Nologic

This is basically a twist on Monamo's Keyboard MouseMover script, by integrating Ejoc's JoyStick UDF.

Movement can be done by ether the POV or Joystick 1, Button 1 acts as Primary Mouse Button and Button 2 as Secondary Mouse Button, with Button 3 being Middle Mouse Button. Acceleration multiplier is Button 6 and ESC will exit the application.

; ////////////////////////////////////
; ///  Original by Monamo
; ///  Original by Ejoc
; ///  Improved by Adam1213
; ///  Modded by Nologic
; ////////////////////////////////////

HotKeySet ( "{ESC}" , "_Quit" )

$Modifier = 1
$Pressed  = 1

$joy = _JoyInit()

While 1
    Sleep(10)
    _CursorMove()
WEnd

$lpJoy = 0 ; Joyclose

;======================================
;   _JoyInit()
;======================================
Func _JoyInit()
    Local $joy
    Global $JOYINFOEX_struct = "dword[13]"

    $joy=DllStructCreate($JOYINFOEX_struct)
    If @Error Then Return 0
    DllStructSetData($joy, 1, DllStructGetSize($joy), 1) ; dwSize  = sizeof(struct)
    DllStructSetData($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

    Dim $coor[8]
    DllCall("Winmm.dll","int","joyGetPosEx", _
        "int",$iJoy,"ptr",DllStructGetPtr($lpJoy))

    If NOT @Error Then
        $coor[0] = DllStructGetData($lpJoy,1,3) ; X Axis
        $coor[1] = DllStructGetData($lpJoy,1,4) ; Y Axis
        $coor[2] = DllStructGetData($lpJoy,1,5) ; Z Axis
        $coor[3] = DllStructGetData($lpJoy,1,6) ; R Axis
        $coor[4] = DllStructGetData($lpJoy,1,7) ; U Axis
        $coor[5] = DllStructGetData($lpJoy,1,8) ; V Axis
        $coor[6] = DllStructGetData($lpJoy,1,11)  ; POV Value
        $coor[7] = DllStructGetData($lpJoy,1,9) ; Buttons Mask
    EndIf

    Return $coor
EndFunc

Func _CursorMove()
    $GamePad_1 = _GetJoy($joy,0)
    If $GamePad_1[6] = 65535 AND $GamePad_1[0] > 30000 AND $GamePad_1[0] < 40000 AND $GamePad_1[1] > 30000 AND $GamePad_1[1] < 40000 Then
        $Modifier = 1
        $Pressed  = 1
    EndIf
    ; Check Keys
    Select
        ; Button 1
        Case $GamePad_1[7] = 1
            MouseClick ( "Primary" )
            Sleep ( 150 )
            Return
        ; Button 2
        Case $GamePad_1[7] = 2
            MouseClick ( "Secondary" )
            Sleep ( 150 )
            Return
        ; Button 3
        Case $GamePad_1[7] = 4
            MouseClick ( "Middle" )
            Return
        ; Up + Left
        Case $GamePad_1[0] < 30000 AND $GamePad_1[1] < 30000 OR $GamePad_1[6] = 31500
            $Delta_X = -1
            $Delta_Y = -1
        ; Up + Right
        Case $GamePad_1[0] > 40000 AND $GamePad_1[1] < 30000 OR $GamePad_1[6] = 4500
            $Delta_X = +1
            $Delta_Y = -1
        ; Down + Left
        Case $GamePad_1[0] < 30000 AND $GamePad_1[1] > 40000 OR $GamePad_1[6] = 22500
            $Delta_X = -1
            $Delta_Y = +1
        ; Down + Right
        Case $GamePad_1[0] > 40000 AND $GamePad_1[1] > 40000 OR $GamePad_1[6] = 13500
            $Delta_X = +1
            $Delta_Y = +1
        ; Arrow Left
        Case $GamePad_1[0] < 30000 OR $GamePad_1[6] = 27000
            $Delta_X = -1
            $Delta_Y =  0
        ; Arrow Up
        Case $GamePad_1[1] < 30000 OR $GamePad_1[6] = 0
            $Delta_X =  0
            $Delta_Y = -1
        ; Arrow Right
        Case $GamePad_1[0] > 40000 OR $GamePad_1[6] = 9000
            $Delta_X = +1
            $Delta_Y =  0
        ; Arrow Down
        Case $GamePad_1[1] > 40000 OR $GamePad_1[6] = 18000
            $Delta_X =  0
            $Delta_Y = +1
        Case Else
            Return
    EndSelect
    ; Boost Mouse Speed
    If IsInt($Pressed / 10) Then
        $Modifier = $Modifier + 1
        $Pressed  = $Pressed  + 1
    Else
        $Pressed = $Pressed + 1
    EndIf
    ; Button 6 Accelerate
    If $GamePad_1[7] = 32 Then
        $Accel = 3
    Else
        $Accel = 1
    EndIf
    ; Throttle Modifier
    If $Modifier >= 15 Then $Modifier = 15
    $X_Axis  = MouseGetPos(0) + ($Delta_X * ($Modifier * $Accel))
    $Y_Axis  = MouseGetPos(1) + ($Delta_Y * ($Modifier * $Accel))
    $Desktop = WinGetPos( "Program Manager" )
    ; Test Location - Multi Monitor
    If $x_Axis < $Desktop[0] Then $x_Axis = $Desktop[0]
    If $Y_Axis < $Desktop[1] Then $Y_Axis = $Desktop[1]
    If $x_Axis > $Desktop[2] - $Desktop[0] Then $x_Axis = $Desktop[2] - $Desktop[0]
    If $Y_Axis > $Desktop[3] - $Desktop[1] Then $Y_Axis = $Desktop[3] - $Desktop[1]
    MouseMove( $X_Axis , $Y_Axis , 1 )
EndFunc

Func _Quit()
    Exit
EndFunc
Edited by Nologic

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.