Tastendrücke oder Mausklicks via Joystick senden

Inhaltsverzeichnis

Wichtige Hinweise

Tastendrücke oder Mausklicks via Joystick-Tasten senden

Unterschiedliche Ansätze

Nachfolgend werden drei Methoden beschrieben, in der Reihenfolge von einfach bis komplex. Die komplexeste Methode eignet sich für die meisten Situationen (z. B. wenn in einem Videospiel eine Tastatur- oder Maustaste gedrückt gehalten werden muss).

Methode #1

Diese Methode sendet einfache Tastendrücke und Mausklicks. Zum Beispiel:

Joy1::Send {Left}  ; Mit Taste #1 einen NACH-LINKS-Tastendruck senden.
Joy2::Click  ; Mit Taste #2 einen Linksklick senden.
Joy3::Send a{Esc}{Space}{Enter}  ; Mit Taste #3 den Buchstaben "a", gefolgt von Escape, Leerzeichen und Enter, senden.
Joy4::Send Mit freundlichen Grüßen,{Enter}Max Mustermann  ; Mit Taste #4 eine zweizeilige Signatur senden.

Um mit einer Taste mehr als einen Befehl zu senden, setzen Sie den ersten Befehl unterhalb des Tastennamens und machen Sie den letzten Befehl zu einem Return. Zum Beispiel:

Joy5::
Run Notepad
WinWait Unbenannt - Editor
WinActivate
Send Dieser Text wird im Texteditor erscheinen.{Enter}
return

In der Tastenliste finden Sie alle Tastatur-, Maus- und Joystick-Tasten.

Methode #2

Diese Methode ist notwendig, wenn eine Tastatur- oder Maustaste während der gesamten Zeit, in der Sie eine Joystick-Taste gedrückt halten, gedrückt gehalten werden muss. Das folgende Beispiel sorgt dafür, dass sich die zweite Taste des Joysticks wie die linke Pfeiltaste verhält:

Joy2::
Send {Left down}  ; Hält die linke Pfeiltaste gedrückt.
KeyWait Joy2  ; Wartet, bis der Benutzer die Joystick-Taste loslässt.
Send {Left up}  ; Lässt die linke Pfeiltaste los.
return

Methode #3

Diese Methode ist notwendig, wenn Sie mehr als einen Joystick-Hotkey wie den von Methode #2 haben und Sie diese Hotkeys manchmal gleichzeitig drücken und loslassen. Das folgende Beispiel sorgt dafür, dass sich die dritte Taste des Joysticks wie die linke Maustaste verhält:

Joy3::
Send {LButton down}   ; Hält die linke Maustaste gedrückt.
SetTimer, AufDritteTasteWarten, 10
return

AufDritteTasteWarten:
if GetKeyState("Joy3")  ; Die Taste ist noch unten, also weiter warten.
    return
; Ansonsten wurde die Taste losgelassen.
Send {LButton up}  ; Lässt die linke Maustaste los.
SetTimer, AufDritteTasteWarten, Off
return

Tastendrücke wiederholt senden

Bei einigen Programmen oder Videospielen kann es erforderlich sein, dass eine Taste wiederholt gesendet werden muss (als würden Sie die Taste auf der Tastatur gedrückt halten). Das folgende Beispiel macht das möglich, indem es wiederholt Leertastendrücke sendet, während Sie die zweite Taste des Joysticks gedrückt halten:

Joy2::
Send {Space down}   ; Drückt die Leertaste nach unten.
SetTimer, AufJoy2Warten, 30  ; Verringern Sie die Zahl 30 auf 20 oder 10, um Tasten schneller zu senden. Erhöhen Sie sie, um Tasten langsamer zu senden.
return

AufJoy2Warten:
if not GetKeyState("Joy2")  ; Die Taste wurde losgelassen.
{
    Send {Space up}  ; Lässt die Leertaste los.
    SetTimer, AufJoy2Warten, Off  ; Stoppt die Überwachung der Taste.
    return
}
; Da oben kein "Return" erfolgt ist, wird die Taste weiter gedrückt gehalten.
Send {Space down}  ; Sendet einen weiteren Leertastendruck.
return

Kontextabhängige Joystick-Tasten

Die Direktiven #IfWinActive/Exist können genutzt werden, um bestimmte Joystick-Tasten je nach Typ des aktiven oder vorhandenen Fensters unterschiedliche (oder gar keine) Aktionen durchzuführen zu lassen.

Joystick als Maus verwenden

Das Joystick-zu-Maus-Skript wandelt einen Joystick durch Neubelegung der Tasten und Achsen-Steuerung in eine Maus um.

Tastendrücke oder Mausklicks via Bedienelemente senden

Um ein Skript auf die Bewegung einer Joystick-Achse oder des Rundblickschalters reagieren zu lassen, verwenden Sie SetTimer in Verbindung mit GetKeyState().

Joystick-Achsen

Das folgende Beispiel sorgt dafür, dass sich die X- und Y-Achsen des Joysticks wie die Pfeiltasten auf der Tastatur verhalten:

#Persistent  ; Lässt das Skript so lange laufen, bis der Benutzer es explizit beendet.
SetTimer, Achsenüberwachung, 5
return

Achsenüberwachung:
JoyX := GetKeyState("JoyX")  ; Ermittelt die Position der X-Achse.
JoyY := GetKeyState("JoyY")  ; Ermittelt die Position der Y-Achse.
VorherGedrückteTaste := GedrückteTaste  ; VorherGedrückteTaste enthält nun die Taste, die vorher unten war (falls vorhanden).

if (JoyX > 70)
    GedrückteTaste := "Right"
else if (JoyX < 30)
    GedrückteTaste := "Left"
else if (JoyY > 70)
    GedrückteTaste := "Down"
else if (JoyY < 30)
    GedrückteTaste := "Up"
else
    GedrückteTaste := ""

if (GedrückteTaste = VorherGedrückteTaste)  ; Die korrekte Taste ist bereits unten (oder keine Taste notwendig).
    return  ; Nichts tun.

; Ansonsten vorherige Taste loslassen und neue Taste drücken:
SetKeyDelay -1  ; Verhindert Verzögerungen zwischen den Tastendrücken.
if VorherGedrückteTaste   ; Es gibt eine vorherige Taste zum Loslassen.
    Send, {%VorherGedrückteTaste% up}  ; Lässt sie los.
if GedrückteTaste   ; Es gibt eine Taste zum Nach-Unten-Drücken.
    Send, {%GedrückteTaste% down}  ; Drückt sie nach unten.
return

Joystick-Rundblickschalter

Das folgende Beispiel sorgt dafür, dass sich der Rundblickschalter des Joysticks wie die Pfeiltasten auf der Tastatur verhält:

#Persistent  ; Lässt das Skript so lange laufen, bis der Benutzer es explizit beendet.
SetTimer, POVÜberwachung, 5
return

POVÜberwachung:
POV := GetKeyState("JoyPOV")  ; Ermittelt die Position des Rundblickschalters.
VorherGedrückteTaste := GedrückteTaste  ; VorherGedrückteTaste enthält nun die Taste, die vorher unten war (falls vorhanden).

; Einige Joysticks haben eventuell einen Rundblickschalter, der keine vordefinierten Richtungen aufweist.
; In diesem Fall können Bereiche verwendet werden:
if (POV < 0)   ; Kein Winkel zu melden
    GedrückteTaste := ""
else if (POV > 31500)               ; 315 bis 360 Grad: Nach vorne gerichtet
    GedrückteTaste := "Up"
else if POV between 0 and 4500      ; 0 bis 45 Grad: Nach vorne gerichtet
    GedrückteTaste := "Up"
else if POV between 4501 and 13500  ; 45 bis 135 Grad: Nach rechts gerichtet
    GedrückteTaste := "Right"
else if POV between 13501 and 22500 ; 135 bis 225 Grad: Nach hinten gerichtet
    GedrückteTaste := "Down"
else                                ; 225 bis 315 Grad: Nach links gerichtet
    GedrückteTaste := "Left"

if (GedrückteTaste = VorherGedrückteTaste)  ; Die korrekte Taste ist bereits unten (oder keine Taste notwendig).
    return  ; Nichts tun.

; Ansonsten vorherige Taste loslassen und neue Taste drücken:
SetKeyDelay -1  ; Verhindert Verzögerungen zwischen den Tastendrücken.
if VorherGedrückteTaste   ; Es gibt eine vorherige Taste zum Loslassen.
    Send, {%VorherGedrückteTaste% up}  ; Lässt sie los.
if GedrückteTaste   ; Es gibt eine Taste zum Nach-Unten-Drücken.
    Send, {%GedrückteTaste% down}  ; Drückt sie nach unten.
return

Tastendrücke wiederholt senden

Beide Beispiele oben können so modifiziert werden, dass sie die Taste wiederholt senden, anstatt sie nur gedrückt zu halten, oder anders gesagt, um das physische Gedrückthalten einer Tastaturtaste zu imitieren. Ersetzen Sie dazu die folgende Zeile:

return  ; Nichts tun.

Mit Folgendem:

{
    if GedrückteTaste
        Send, {%GedrückteTaste% down}  ; Tastendrücke wiederholt senden.
    return
}

Bemerkungen

Um anstelle des ersten Joysticks einen anderen Joystick zu verwenden, schreiben Sie vor dem Tasten- oder Achsennamen die Nummer des Joysticks. Zum Beispiel wäre 2Joy1 die erste Taste des zweiten Joysticks.

Im AutoHotkey-Forum können Sie weitere nützliche Joystick-Skripte finden. Geben Sie Schlüsselwörter wie Joystick and GetKeyState and Send an, um relevante Themen zu finden.