; Using a Joystick as a Mouse ; http://www.autohotkey.com ; Save as JoystickMouse.ahk (not as a textfile) ; This script converts a joystick into a three-button mouse.  It allows each ; button to drag just like a mouse button and it uses virtually no CPU time. ; Also, it will move the cursor faster depending on how far you push the joystick ; from center. You can personalize various settings at the top of the script.   ; Increase the following value to make the mouse cursor move faster: JoyMultiplier = 0.30   ; Decrease the following value to require less joystick displacement-from-center ; to start moving the mouse.  However, you may need to calibrate your joystick ; -- ensuring it's properly centered -- to avoid cursor drift. A perfectly tight ; and centered joystick could use a value of 1: JoyThreshold = 10   ; Change the following to true to invert the Y-axis, which causes the mouse to ; move vertically in the direction opposite the stick: InvertYAxis := false   ; Change these values to use joystick button numbers other than 1, 2, and 3 for ; the left, right, and middle mouse buttons.  Available numbers are 1 through 32. ; Use the Joystick Test Script to find out your joystick's numbers more easily. ButtonLeft = 9 ButtonRight = 10 ButtonMiddle = 3   ; If your joystick has a POV control, you can use it as a mouse wheel.  The ; following value is the number of milliseconds between turns of the wheel. ; Decrease it to have the wheel turn faster: WheelDelay = 150   ; If your system has more than one joystick, increase this value to use a joystick ; other than the first: JoystickNumber = 1   ; END OF CONFIG SECTION -- Don't change anything below this point unless you want ; to alter the basic nature of the script.   #SingleInstance   JoystickPrefix = %JoystickNumber%Joy Hotkey, %JoystickPrefix%%ButtonLeft%, ButtonLeft Hotkey, %JoystickPrefix%%ButtonRight%, ButtonRight Hotkey, %JoystickPrefix%%ButtonMiddle%, ButtonMiddle   ; Calculate the axis displacements that are needed to start moving the cursor: JoyThresholdUpper := 50 + JoyThreshold JoyThresholdLower := 50 - JoyThreshold if InvertYAxis     YAxisMultiplier = -1 else     YAxisMultiplier = 1   SetTimer, WatchJoystick, 10  ; Monitor the movement of the joystick.   GetKeyState, JoyInfo, %JoystickNumber%JoyInfo IfInString, JoyInfo, P  ; Joystick has POV control, so use it as a mouse wheel.     SetTimer, MouseWheel, %WheelDelay%   return  ; End of auto-execute section.     ; The subroutines below do not use KeyWait because that would sometimes trap the ; WatchJoystick quasi-thread beneath the wait-for-button-up thread, which would ; effectively prevent mouse-dragging with the joystick.   ButtonLeft: SetMouseDelay, -1  ; Makes movement smoother. MouseClick, left,,, 1, 0, D  ; Hold down the left mouse button. SetTimer, WaitForLeftButtonUp, 10 return   ButtonRight: SetMouseDelay, -1  ; Makes movement smoother. MouseClick, right,,, 1, 0, D  ; Hold down the right mouse button. SetTimer, WaitForRightButtonUp, 10 return   ButtonMiddle: SetMouseDelay, -1  ; Makes movement smoother. MouseClick, middle,,, 1, 0, D  ; Hold down the right mouse button. SetTimer, WaitForMiddleButtonUp, 10 return   WaitForLeftButtonUp: if GetKeyState(JoystickPrefix . ButtonLeft)     return  ; The button is still, down, so keep waiting. ; Otherwise, the button has been released. SetTimer, WaitForLeftButtonUp, off SetMouseDelay, -1  ; Makes movement smoother. MouseClick, left,,, 1, 0, U  ; Release the mouse button. return   WaitForRightButtonUp: if GetKeyState(JoystickPrefix . ButtonRight)     return  ; The button is still, down, so keep waiting. ; Otherwise, the button has been released. SetTimer, WaitForRightButtonUp, off MouseClick, right,,, 1, 0, U  ; Release the mouse button. return   WaitForMiddleButtonUp: if GetKeyState(JoystickPrefix . ButtonMiddle)     return  ; The button is still, down, so keep waiting. ; Otherwise, the button has been released. SetTimer, WaitForMiddleButtonUp, off MouseClick, middle,,, 1, 0, U  ; Release the mouse button. return   WatchJoystick:  if(InputMode = MouseMode){     MouseNeedsToBeMoved := false  ; Set default.     SetFormat, float, 03     GetKeyState, joyu, %JoystickNumber%JoyU     GetKeyState, joyr, %JoystickNumber%JoyR     if joyu > %JoyThresholdUpper%     {         MouseNeedsToBeMoved := true         DeltaX := joyu - JoyThresholdUpper     }     else if joyu < %JoyThresholdLower%     {         MouseNeedsToBeMoved := true         DeltaX := joyu - JoyThresholdLower     }     else         DeltaX = 0     if joyr > %JoyThresholdUpper%     {         MouseNeedsToBeMoved := true         DeltaY := joyr - JoyThresholdUpper     }     else if joyr < %JoyThresholdLower%     {         MouseNeedsToBeMoved := true         DeltaY := joyr - JoyThresholdLower     }     else         DeltaY = 0     if MouseNeedsToBeMoved     {         SetMouseDelay, -1  ; Makes movement smoother.         MouseMove, DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier, 0, R     } } return   MouseWheel: GetKeyState, JoyPOV, %JoystickNumber%JoyPOV if JoyPOV = -1  ; No angle.     return if (JoyPOV > 31500 or JoyPOV < 4500)  ; Forward     Send {WheelUp} else if JoyPOV between 13500 and 22500  ; Back     Send {WheelDown} return