Sign in to follow this  
Followers 0
Nologic

GamePad MouseMover

3 posts in this topic

#1 ·  Posted (edited)

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



Thanks, working perfectly.

Share this post


Link to post
Share on other sites

Thanks, working perfectly.

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  
Followers 0