Tastendrücke oder Mausklicks via Controller senden

Inhaltsverzeichnis

Wichtige Hinweise

Tastendrücke oder Mausklicks via Controllertasten senden

Verschiedene Ansätze

Nachfolgend werden drei Methoden beschrieben, 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}  ; Taste #1 einen NACH-LINKS-Tastendruck senden lassen.
Joy2::Click  ; Taste #2 einen Linksklick senden lassen.
Joy3::Send a{Esc}{Space}{Enter}  ; Taste #3 den Buchstaben "a" gefolgt von Escape, Leerzeichen und Enter senden lassen.
Joy4::Send Mit freundlichen Grüßen,{Enter}Max Mustermann  ; Taste #4 eine zweizeilige Signatur senden lassen.

Um eine Taste mehrere Befehle senden zu lassen, setzen Sie den ersten Befehl unter den Tastennamen und machen Sie den letzten Befehl zu einem Return. Zum Beispiel:

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

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

Methode #2

Diese Methode wird benötigt, wenn eine Tastatur- oder Maustaste während der gesamten Zeit, in der Sie eine Controllertaste gedrückt halten, gedrückt gehalten werden muss. Das folgende Beispiel bewirkt, dass sich die zweite Taste des Controllers wie die linke Pfeiltaste verhält:

Joy2::
Send {Left down}  ; Die linke Pfeiltaste gedrückt halten.
KeyWait Joy2  ; Warten, bis der Benutzer die Controllertaste loslässt.
Send {Left up}  ; Die linke Pfeiltaste loslassen.
return

Methode #3

Diese Methode wird benötigt, wenn Sie mehr als einen Controller-Hotkey wie den von Methode #2 haben und Sie diese Hotkeys manchmal gleichzeitig drücken und loslassen. Das folgende Beispiel bewirkt, dass sich die dritte Taste des Controllers wie die linke Maustaste verhält:

Joy3::
Send {LButton down}   ; Die linke Maustaste gedrückt halten.
SetTimer, AufDritteTasteWarten, 10
return

AufDritteTasteWarten:
if GetKeyState("Joy3")  ; Die Taste ist noch unten, also weiter warten.
    return
; Andernfalls wurde die Taste losgelassen.
Send {LButton up}  ; Die linke Maustaste loslassen.
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 dies möglich, indem es wiederholt Leertastendrücke sendet, während Sie die zweite Taste des Controllers gedrückt halten:

Joy2::
Send {Space down}   ; Die Leertaste gedrückt halten.
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}  ; Die Leertaste loslassen.
    SetTimer, AufJoy2Warten, Off  ; Überwachung der Taste stoppen.
    return
}
; Da oben kein "Return" erfolgt ist, wird die Taste weiter gedrückt gehalten.
Send {Space down}  ; Einen weiteren Leertastendruck senden.
return

Kontextabhängige Controllertasten

Die Direktiven #IfWinActive/Exist können verwendet werden, um bestimmte Controllertasten je nach aktivem oder existierendem Fenster eine andere (oder gar keine) Aktion ausführen zu lassen.

Controller als Maus verwenden

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

Tastendrücke oder Mausklicks via Bedienelemente senden

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

Controller-Achsen

Das folgende Beispiel bewirkt, dass sich die X- und Y-Achse des Sticks wie die Pfeiltasten auf der Tastatur verhalten:

#Persistent  ; Skript laufen lassen, bis der Benutzer es explizit beendet.
SetTimer, AchsenÜberwachen, 5
return

AchsenÜberwachen:
JoyX := GetKeyState("JoyX")  ; Position der X-Achse abrufen.
JoyY := GetKeyState("JoyY")  ; Position der Y-Achse abrufen.
TasteZumGedrückthaltenVorher := TasteZumGedrückthalten  ; Vorher enthält nun die Taste, die vorher gedrückt gehalten wurde (falls vorhanden).

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

if (TasteZumGedrückthalten = TasteZumGedrückthaltenVorher)  ; Die korrekte Taste ist bereits unten (oder keine Taste notwendig).
    return  ; Nichts tun.

; Andernfalls vorherige Taste loslassen und neue Taste gedrückt halten:
SetKeyDelay -1  ; Verzögerungen zwischen Tastendrücke verhindern.
if TasteZumGedrückthaltenVorher   ; Es gibt eine vorherige Taste zum Loslassen.
    Send, {%TasteZumGedrückthaltenVorher% up}  ; Taste loslassen.
if TasteZumGedrückthalten   ; Es gibt eine Taste zum Gedrückthalten.
    Send, {%TasteZumGedrückthalten% down}  ; Taste gedrückt halten.
return

Controller-Rundblickschalter

Das folgende Beispiel bewirkt, dass sich der Rundblickschalter des Controllers wie die Pfeiltasten auf der Tastatur verhält:

#Persistent  ; Skript laufen lassen, bis der Benutzer es explizit beendet.
SetTimer, POVÜberwachen, 5
return

POVÜberwachen:
POV := GetKeyState("JoyPOV")  ; Position des Rundblickschalters abrufen.
TasteZumGedrückthaltenVorher := TasteZumGedrückthalten  ; Vorher enthält nun die Taste, die vorher gedrückt gehalten wurde (falls vorhanden).

; Einige Controller können einen stufenlosen/genauen Rundblickschalter haben, anstatt einen mit vordefinierten Richtungen.
; In diesem Fall können Bereiche verwendet werden:
if (POV < 0)   ; Kein Winkel zu melden
    TasteZumGedrückthalten := ""
else if (POV > 31500)               ; 315 bis 360 Grad: Nach vorne gerichtet
    TasteZumGedrückthalten := "Up"
else if POV between 0 and 4500      ; 0 bis 45 Grad: Nach vorne gerichtet
    TasteZumGedrückthalten := "Up"
else if POV between 4501 and 13500  ; 45 bis 135 Grad: Nach rechts gerichtet
    TasteZumGedrückthalten := "Right"
else if POV between 13501 and 22500 ; 135 bis 225 Grad: Nach hinten gerichtet
    TasteZumGedrückthalten := "Down"
else                                ; 225 bis 315 Grad: Nach links gerichtet
    TasteZumGedrückthalten := "Left"

if (TasteZumGedrückthalten = TasteZumGedrückthaltenVorher)  ; Die korrekte Taste ist bereits unten (oder keine Taste notwendig).
    return  ; Nichts tun.

; Andernfalls vorherige Taste loslassen und neue Taste gedrückt halten:
SetKeyDelay -1  ; Verzögerungen zwischen Tastendrücke verhindern.
if TasteZumGedrückthaltenVorher   ; Es gibt eine vorherige Taste zum Loslassen.
    Send, {%TasteZumGedrückthaltenVorher% up}  ; Taste loslassen.
if TasteZumGedrückthalten   ; Es gibt eine Taste zum Gedrückthalten.
    Send, {%TasteZumGedrückthalten% down}  ; Taste gedrückt halten.
return

Tastendrücke wiederholt senden

Die beiden obigen Beispiele können so modifiziert werden, dass die Taste wiederholt gesendet wird, anstatt sie nur gedrückt zu halten, d.h. um das physische Gedrückthalten einer Tastaturtaste zu imitieren. Ersetzen Sie dazu die folgende Zeile:

return  ; Nichts tun.

Mit den folgenden Zeilen:

{
    if TasteZumGedrückthalten
        Send, {%TasteZumGedrückthalten% down}  ; Tastendruck wiederholt senden.
    return
}

Bemerkungen

Um einen anderen Controller als den ersten zu verwenden, stellen Sie dem Namen der Taste oder Achse die Nummer des Controllers voran. Zum Beispiel wäre 2Joy1 die erste Taste des zweiten Controllers.

Weitere nützliche Controllerskripte finden Sie im AutoHotkey-Forum. Verwenden Sie Suchbegriffe wie Controller and GetKeyState and Send, um relevante Themen zu finden.