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 mehr als eine Zeile ausführen zu lassen, setzen Sie die Zeilen unter den Tastennamen und umschließen Sie sie mit geschweiften Klammern. Zum Beispiel:

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

Weitere Informationen finden Sie unter Wie man Hotkeys schreibt.

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.
}

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
}

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 , 0
}

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.
}

AufJoy2Warten()
{
    if not GetKeyState("Joy2")  ; Die Taste wurde losgelassen.
    {
        Send "{Space up}"  ; Die Leertaste loslassen.
        SetTimer , 0  ; Ü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.
}

Kontextabhängige Controllertasten

Die #HotIf-Direktive kann verwendet werden, um bestimmte Controllertasten je nach Bedingung (z.B. Typ des aktiven Fensters) unterschiedliche (oder gar keine) Aktionen 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:

SetTimer AchsenÜberwachen, 5

AchsenÜberwachen()
{
    static TasteZumGedrückthalten := ""
    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.
}

Controller-Rundblickschalter

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

SetTimer POVÜberwachen, 5

POVÜberwachen()
{
    static TasteZumGedrückthalten := ""
    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 >= 0 and POV <= 4500      ; 0 bis 45 Grad: Nach vorne gerichtet
        TasteZumGedrückthalten := "Up"
    else if POV >= 4501 and POV <= 13500  ; 45 bis 135 Grad: Nach rechts gerichtet
        TasteZumGedrückthalten := "Right"
    else if POV >= 13501 and POV <= 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.
}

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.