Joystick als Maus verwenden

Dieses Skript wandelt einen Joystick in eine Maus mit drei Tasten um. Dadurch verhält sich jede Joystick-Taste wie eine Maustaste und verbraucht kaum CPU-Zeit. Außerdem ist die Zeigergeschwindigkeit abhängig davon, wie weit der Joystick vom Zentrum gedrückt wird. Verschiedene Einstellungen können auch im oberen Bereich des Skripts angepasst werden.

Dieses Skript herunterladen | Andere Beispiel-Skripte | Home

; Den folgenden Wert erhöhen, damit der Mauszeiger sich schneller bewegt:
JoyMultiplier = 0.30

; Den folgenden Wert verringern, damit weniger Weg vom Zentrum benötigt wird,
; um den Mauszeiger zu bewegen.  Allerdings muss möglicherweise erst der aktuelle Joystick kalibriert werden,
; damit er richtig zentriert ist, um einen Drift des Mauszeigers zu verhindern. Ein absolut straffer
; und zentrierter Joystick kann eine 1 verwenden:
JoyThreshold = 3

; Für die Invertierung der Y-Achsen kann die folgende Variable auf True gesetzt werden, wodurch
; die sich der Mauszeiger vertikal in die entgegengesetzte Richtung des Sticks bewegt:
InvertYAxis := false

; Diese Werte können geändert werden, um beliebige Joystick-Tastennummern für
; die linke, rechte und mittlere Maustaste zu verwenden.  Zahlen von 1 bis 32 sind verfügbar.
; Verwendet das Joystick-Test-Skript, um die aktuellen Joystick-Nummern einfach herauszufinden.
ButtonLeft = 1
ButtonRight = 2
ButtonMiddle = 3

; Falls der aktuelle Joystick einen Rundblickschalter (POV) hat, dann kann dieser als Mausrad verwendet werden.  Der
; folgende Wert ist die Anzahl der Millisekunden zwischen den Drehungen des Rades.
; Wird der Wert verringert, dreht sich das Rad schneller:
WheelDelay = 250

; Falls Ihr System mehr als ein Joystick aufweist, können Sie diesen Wert erhöhen,
; um anstelle des ersten Joysticks einen anderen zu verwenden:
JoystickNumber = 1

; ENDE DES KONFIGURATIONSBEREICHS -- Hier danach keine Änderungen durchführen,
; es sei denn, die allgemeine Funktionalität des Skripts soll geändert werden.

#SingleInstance

JoystickPrefix = %JoystickNumber%Joy
Hotkey, %JoystickPrefix%%ButtonLeft%, ButtonLeft
Hotkey, %JoystickPrefix%%ButtonRight%, ButtonRight
Hotkey, %JoystickPrefix%%ButtonMiddle%, ButtonMiddle

; Benötigte Achsenabstände berechnen, um den Mauszeiger bewegen zu können:
JoyThresholdUpper := 50 + JoyThreshold
JoyThresholdLower := 50 - JoyThreshold
if InvertYAxis
    YAxisMultiplier = -1
else
    YAxisMultiplier = 1

SetTimer, WatchJoystick, 10  ; Joystick-Bewegung überwachen.

GetKeyState, JoyInfo, %JoystickNumber%JoyInfo
IfInString, JoyInfo, P  ; Joystick hat einen Rundblickschalter (POV), also als Mausrad verwenden.
    SetTimer, MouseWheel, %WheelDelay%

return  ; Ende des automatischen Ausführungsbereichs.


; Die unteren Subroutinen verwenden nicht KeyWait, weil ansonsten der
; WatchJoystick-Quasi-Thread unter dem Warten-auf-Tastendruck-Thread eingefangen wird,
; wodurch das Ziehen des Mauszeigers mit dem Joystick unterdrückt wird.

ButtonLeft:
SetMouseDelay, -1  ; Flüssigerer Bewegungsablauf.
MouseClick, left,,, 1, 0, D  ; Hält die linke Maustaste gedrückt.
SetTimer, WaitForLeftButtonUp, 10
return

ButtonRight:
SetMouseDelay, -1  ; Flüssigerer Bewegungsablauf.
MouseClick, right,,, 1, 0, D  ; Hält die rechte Maustaste gedrückt.
SetTimer, WaitForRightButtonUp, 10
return

ButtonMiddle:
SetMouseDelay, -1  ; Flüssigerer Bewegungsablauf.
MouseClick, middle,,, 1, 0, D  ; Hält die rechte Maustaste gedrückt.
SetTimer, WaitForMiddleButtonUp, 10
return

WaitForLeftButtonUp:
if GetKeyState(JoystickPrefix . ButtonLeft)
    return  ; Die Taste ist noch unten, also weiter warten.
; Ansonsten wurde die Taste losgelassen.
SetTimer, WaitForLeftButtonUp, Off
SetMouseDelay, -1  ; Flüssigerer Bewegungsablauf.
MouseClick, left,,, 1, 0, U  ; Lässt die Maustaste los.
return

WaitForRightButtonUp:
if GetKeyState(JoystickPrefix . ButtonRight)
    return  ; Die Taste ist noch unten, also weiter warten.
; Ansonsten wurde die Taste losgelassen.
SetTimer, WaitForRightButtonUp, Off
MouseClick, right,,, 1, 0, U  ; Lässt die Maustaste los.
return

WaitForMiddleButtonUp:
if GetKeyState(JoystickPrefix . ButtonMiddle)
    return  ; Die Taste ist noch unten, also weiter warten.
; Ansonsten wurde die Taste losgelassen.
SetTimer, WaitForMiddleButtonUp, Off
MouseClick, middle,,, 1, 0, U  ; Lässt die Maustaste los.
return

WatchJoystick:
MouseNeedsToBeMoved := false  ; Standardwert setzen.
SetFormat, float, 03
GetKeyState, JoyX, %JoystickNumber%JoyX
GetKeyState, JoyY, %JoystickNumber%JoyY
if JoyX > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaX := JoyX - JoyThresholdUpper
}
else if JoyX < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaX := JoyX - JoyThresholdLower
}
else
    DeltaX = 0
if JoyY > %JoyThresholdUpper%
{
    MouseNeedsToBeMoved := true
    DeltaY := JoyY - JoyThresholdUpper
}
else if JoyY < %JoyThresholdLower%
{
    MouseNeedsToBeMoved := true
    DeltaY := JoyY - JoyThresholdLower
}
else
    DeltaY = 0
if MouseNeedsToBeMoved
{
    SetMouseDelay, -1  ; Flüssigerer Bewegungsablauf.
    MouseMove, DeltaX * JoyMultiplier, DeltaY * JoyMultiplier * YAxisMultiplier, 0, R
}
return

MouseWheel:
GetKeyState, JoyPOV, %JoystickNumber%JoyPOV
if JoyPOV = -1  ; Kein Winkel.
    return
if (JoyPOV > 31500 or JoyPOV < 4500)  ; Nach vorne
    Send {WheelUp}
else if JoyPOV between 13500 and 22500  ; Nach hinten
    Send {WheelDown}
return