guides:joysticks

Joysticks

To begin using your joystick with AutoHotkey, you need to detect the inputs (buttons, axes, etc.) and identify their corresponding identifiers in AHK.

Create a new AHK script file (e.g., joystick_test.ahk) and paste the following code:

#Requires AutoHotkey v1.1
#Persistent
#SingleInstance Force
SetTimer, WatchJoystick, 10
return
 
WatchJoystick:
JoyX := GetKeyState("JoyX")
JoyY := GetKeyState("JoyY")
JoyZ := GetKeyState("JoyZ")
JoyR := GetKeyState("JoyR")
JoyU := GetKeyState("JoyU")
JoyV := GetKeyState("JoyV")
JoyButtons := ""
Loop, 32 {
    if GetKeyState("Joy" . A_Index)
        JoyButtons .= "Joy" . A_Index . " "
}
ToolTip, X%JoyX% Y%JoyY% Z%JoyZ% R%JoyR% U%JoyU% V%JoyV%`n%JoyButtons%
return

This script continuously monitors joystick inputs and displays them in a tooltip. Run this script and move your joystick or press its buttons to see the corresponding values and identifiers.

You can remap joystick buttons to keyboard keys using the following syntax:

#Requires AutoHotkey v1.1
Joy1::Send, {Space}   ; Remaps joystick button 1 to the spacebar
Joy2::Send, {Enter}   ; Remaps joystick button 2 to the enter key

Save and run this script, and pressing joystick button 1 will simulate pressing the spacebar, while button 2 will simulate pressing the enter key.

You can also use joystick axes to control various functions. For example, to control the mouse cursor with a joystick:

#Requires AutoHotkey v1.1
#Persistent
SetTimer, WatchJoystick, 10
return
 
WatchJoystick:
JoyX := GetKeyState("JoyX", "P") ; Get X-axis position
JoyY := GetKeyState("JoyY", "P") ; Get Y-axis position
JoyX := JoyX/100 * 5  ; Scale the axis value
JoyY := JoyY/100 * 5
MouseMove, JoyX, JoyY, 0, R  ; Move the mouse cursor
return

This script scales the joystick's X and Y axis values and moves the mouse cursor accordingly.

You can create more complex scripts by combining multiple joystick inputs. For instance, to perform different actions based on combinations of buttons and axes:

#Requires AutoHotkey v1.1
#Persistent
#SingleInstance Force
 
Joy1 & Joy2::Send, ^c  ; Ctrl+C when both button 1 and 2 are pressed together
Joy1 & Joy3::Send, ^v  ; Ctrl+V when button 1 and 3 are pressed together
 
SetTimer, CheckAxis, 10
return
 
CheckAxis:
JoyX := GetKeyState("JoyX", "P")
JoyY := GetKeyState("JoyY", "P")
if (JoyX > 70) and (JoyY < 30)
{
    Send, {Left}
}
else if (JoyX < 30) and (JoyY > 70)
{
    Send, {Right}
}
return

This script sends `Ctrl+C` when buttons 1 and 2 are pressed simultaneously, `Ctrl+V` when buttons 1 and 3 are pressed, and moves the cursor left or right based on joystick axis positions.

For more advanced usage, you can define custom functions that are triggered by joystick inputs:

#Requires AutoHotkey v1.1
#Persistent
#SingleInstance Force
 
Joy1::CustomFunction()
 
CustomFunction()
{
    MsgBox, Joystick Button 1 Pressed!
    ; Add custom code here
}
 
return

This script calls the `CustomFunction()` whenever joystick button 1 is pressed, and you can insert any custom code within this function.