<script src="../static/ga4.js" type="text/javascript"></script> </head> <body> <h1>Tastendrücke oder Mausklicks via Controller senden</h1> <h2 id="toc">Inhaltsverzeichnis</h2> <ul> <li><a href="#imp">Wichtige Hinweise</a></li> <li><a href="#button">Tastendrücke oder Mausklicks via Controllertasten senden</a> <ul> <li><a href="#different-approaches">Verschiedene Ansätze</a></li> <li><a href="#auto-repeating-controller-buttons">Tastendrücke wiederholt senden</a></li> <li><a href="#context-sensitive-controller-buttons">Kontextabhängige Controllertasten</a></li> <li><a href="#using-a-controller-as-a-mouse">Controller als Maus verwenden</a></li> </ul></li> <li><a href="#axis">Tastendrücke oder Mausklicks via Bedienelemente senden</a> <ul> <li><a href="#controller-axes">Controller-Achsen</a></li> <li><a href="#controller-pov-hat">Controller-Rundblickschalter</a></li> <li><a href="#auto-repeating-other">Tastendrücke wiederholt senden</a></li> </ul></li> <li><a href="#Remarks">Bemerkungen</a></li> <li><a href="#related">Siehe auch</a></li> </ul> <h2 id="imp">Wichtige Hinweise</h2> <ul> <li>Aus historischen Gründen beginnen die folgenden Namen der Tasten und Bedienelemente mit <code>Joy</code>, was für Joystick steht. In der Regel funktionieren sie aber auch für andere Gamecontroller wie Gamepads oder Lenkräder.</li> <li>Eine Controllertaste oder -achse kann zu einer Taste oder Maustaste umbelegt werden, aber nicht zu einer anderen Controllertaste oder -achse. Dies wäre nur mit einem Controller-Emulator wie <a href="https://sourceforge.net/projects/vjoystick/">vJoy</a> möglich.</li> <li>AutoHotkey identifiziert jede Taste auf einem Controller mit einer eindeutigen Nummer zwischen 1 und 32. Diese Nummern können mit dem <a href="../scripts/index.htm#ControllerTest">Controller-Testskript</a> ermittelt werden.</li> <li>Bei Xbox-Controllern ab 2013 (alle neueren als der Xbox 360-Controller) funktionieren Joy1- bis Joy32-Hotkeys nur, wenn ein zum Skript gehörendes Fenster aktiv ist, z.B. ein <a href="../lib/MsgBox.htm">Mitteilungsfenster</a>, eine <a href="../lib/Gui.htm">GUI</a> oder das <a href="../Program.htm#main-window">Hauptfenster des Skripts</a>. Diese Einschränkung gilt auch für <a href="../lib/GetKeyState.htm">GetKeyState</a> bzgl. Joy1 bis Joy32 und JoyX, JoyY, JoyZ, JoyR, JoyU, JoyPOV (und möglicherweise JoyV), aber nicht bzgl. JoyName, JoyButtons, JoyAxes und JoyInfo. Um diese Controllereingaben für andere aktive Fenster zu erkennen, verwenden Sie die <a href="https://www.autohotkey.com/boards/viewtopic.php?f=6&t=29659">XInput.ahk-Bibliothek</a>.</li> </ul> <h2 id="button">Tastendrücke oder Mausklicks via Controllertasten senden</h2> <h3 id="different-approaches">Verschiedene Ansätze</h3> <p>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).</p> <h4 id="Method_1">Methode #1</h4> <p>Diese Methode sendet einfache Tastendrücke und Mausklicks. Zum Beispiel:</p> <pre>Joy1::<a href="../lib/Send.htm">Send</a> {Left} <em>; Taste #1 einen NACH-LINKS-Tastendruck senden lassen.</em> Joy2::<a href="../lib/Click.htm">Click</a> <em>; Taste #2 einen Linksklick senden lassen.</em> Joy3::Send a{Esc}{Space}{Enter} <em>; Taste #3 den Buchstaben "a" gefolgt von Escape, Leerzeichen und Enter senden lassen.</em> Joy4::Send Mit freundlichen Grüßen,{Enter}Max Mustermann <em>; Taste #4 eine zweizeilige Signatur senden lassen.</em></pre> <p>Um eine Taste mehrere Befehle senden zu lassen, setzen Sie den ersten Befehl <em>unter</em> den Tastennamen und machen Sie den letzten Befehl zu einem <a href="../lib/Return.htm">Return</a>. Zum Beispiel:</p> <pre>Joy5:: Run Notepad WinWait Unbenannt - Editor WinActivate Send Dieser Text wird in Notepad erscheinen.{Enter} return</pre> <p>In der <a href="../KeyList.htm">Tastenliste</a> finden Sie alle Tastatur-, Maus- und Controllertasten.</p> <h4 id="Method_2">Methode #2</h4> <p>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:</p> <pre>Joy2:: Send {Left down} <em>; Die linke Pfeiltaste gedrückt halten.</em> <a href="../lib/KeyWait.htm">KeyWait</a> Joy2 <em>; Warten, bis der Benutzer die Controllertaste loslässt.</em> Send {Left up} <em>; Die linke Pfeiltaste loslassen.</em> return</pre> <h4 id="Method_3">Methode #3</h4> <p>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:</p> <pre>Joy3:: Send {LButton down} <em>; Die linke Maustaste gedrückt halten.</em> SetTimer, AufDritteTasteWarten, 10 return AufDritteTasteWarten: if <a href="../lib/GetKeyState.htm#function">GetKeyState</a>("Joy3") <em>; Die Taste ist noch unten, also weiter warten.</em> return <em>; Andernfalls wurde die Taste losgelassen.</em> Send {LButton up} <em>; Die linke Maustaste loslassen.</em> SetTimer, AufDritteTasteWarten, Off return </pre> <a id="auto-repeating-joystick-buttons"></a> <h3 id="auto-repeating-controller-buttons">Tastendrücke wiederholt senden</h3> <p>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:</p> <pre>Joy2:: Send {Space down} <em>; Die Leertaste gedrückt halten.</em> SetTimer, AufJoy2Warten, <strong>30</strong> <em>; Verringern Sie die Zahl <strong>30</strong> auf 20 oder 10, um Tasten schneller zu senden. Erhöhen Sie sie, um Tasten langsamer zu senden.</em> return AufJoy2Warten: if not GetKeyState("Joy2") <em>; Die Taste wurde losgelassen.</em> { Send {Space up} <em>; Die Leertaste loslassen.</em> SetTimer, AufJoy2Warten, Off <em>; Überwachung der Taste stoppen.</em> return } <em>; Da oben kein "Return" erfolgt ist, wird die Taste weiter gedrückt gehalten.</em> Send {Space down} <em>; Einen weiteren Leertastendruck senden.</em> return</pre> <a id="context-sensitive-joystick-buttons"></a> <h3 id="context-sensitive-controller-buttons">Kontextabhängige Controllertasten</h3> <p>Die Direktiven <a href="../lib/_IfWinActive.htm">#IfWinActive/Exist</a> können verwendet werden, um bestimmte Controllertasten je nach aktivem oder existierendem Fenster eine andere (oder gar keine) Aktion ausführen zu lassen.</p> <a id="using-a-joystick-as-a-mouse"></a> <h3 id="using-a-controller-as-a-mouse">Controller als Maus verwenden</h3> <p>Das <a href="../scripts/index.htm#ControllerMouse">Controller-zu-Maus-Skript</a> wandelt einen Controller durch Neubelegung der Tasten und Achsen in eine Maus um.</p> <h2 id="axis">Tastendrücke oder Mausklicks via Bedienelemente senden</h2> <p>Um ein Skript auf die Bewegung einer Achse oder des Rundblickschalters des Sticks reagieren zu lassen, verwenden Sie <a href="../lib/SetTimer.htm">SetTimer</a> in Verbindung mit <a href="../lib/GetKeyState.htm">GetKeyState</a>.</p> <a id="joystick-axes"></a> <h3 id="controller-axes">Controller-Achsen</h3> <p>Das folgende Beispiel bewirkt, dass sich die X- und Y-Achse des Sticks wie die Pfeiltasten auf der Tastatur verhalten:</p> <pre>#Persistent <em>; Skript laufen lassen, bis der Benutzer es explizit beendet.</em> <a href="../lib/SetTimer.htm">SetTimer</a>, AchsenÜberwachen, 5 return AchsenÜberwachen: JoyX := <a href="../lib/GetKeyState.htm#function">GetKeyState</a>("JoyX") <em>; Position der X-Achse abrufen.</em> JoyY := GetKeyState("JoyY") <em>; Position der Y-Achse abrufen.</em> TasteZumGedrückthaltenVorher := TasteZumGedrückthalten <em>; Vorher enthält nun die Taste, die vorher gedrückt gehalten wurde (falls vorhanden).</em> if (JoyX &gt; 70) TasteZumGedrückthalten := "Right" else if (JoyX &lt; 30) TasteZumGedrückthalten := "Left" else if (JoyY &gt; 70) TasteZumGedrückthalten := "Down" else if (JoyY &lt; 30) TasteZumGedrückthalten := "Up" else TasteZumGedrückthalten := "" if (TasteZumGedrückthalten = TasteZumGedrückthaltenVorher) <em>; Die korrekte Taste ist bereits unten (oder keine Taste notwendig).</em> return <em>; Nichts tun.</em> <em>; Andernfalls vorherige Taste loslassen und neue Taste gedrückt halten:</em> SetKeyDelay -1 <em>; Verzögerungen zwischen Tastendrücke verhindern.</em> if TasteZumGedrückthaltenVorher <em>; Es gibt eine vorherige Taste zum Loslassen.</em> Send, {%TasteZumGedrückthaltenVorher% up} <em>; Taste loslassen.</em> if TasteZumGedrückthalten <em>; Es gibt eine Taste zum Gedrückthalten.</em> Send, {%TasteZumGedrückthalten% down} <em>; Taste gedrückt halten.</em> return</pre> <a id="joystick-pov-hat"></a> <h3 id="controller-pov-hat">Controller-Rundblickschalter</h3> <p>Das folgende Beispiel bewirkt, dass sich der Rundblickschalter des Controllers wie die Pfeiltasten auf der Tastatur verhält:</p> <pre>#Persistent <em>; Skript laufen lassen, bis der Benutzer es explizit beendet.</em> SetTimer, POVÜberwachen, 5 return POVÜberwachen: POV := GetKeyState("JoyPOV") <em>; Position des Rundblickschalters abrufen.</em> TasteZumGedrückthaltenVorher := TasteZumGedrückthalten <em>; Vorher enthält nun die Taste, die vorher gedrückt gehalten wurde (falls vorhanden).</em> <em>; Einige Controller können einen stufenlosen/genauen Rundblickschalter haben, anstatt einen mit vordefinierten Richtungen. ; In diesem Fall können Bereiche verwendet werden:</em> if (POV &lt; 0) <em>; Kein Winkel zu melden</em> TasteZumGedrückthalten := "" else if (POV &gt; 31500) <em>; 315 bis 360 Grad: Nach vorne gerichtet</em> TasteZumGedrückthalten := "Up" else if POV between 0 and 4500 <em>; 0 bis 45 Grad: Nach vorne gerichtet</em> TasteZumGedrückthalten := "Up" else if POV between 4501 and 13500 <em>; 45 bis 135 Grad: Nach rechts gerichtet</em> TasteZumGedrückthalten := "Right" else if POV between 13501 and 22500 <em>; 135 bis 225 Grad: Nach hinten gerichtet</em> TasteZumGedrückthalten := "Down" else <em>; 225 bis 315 Grad: Nach links gerichtet</em> TasteZumGedrückthalten := "Left" if (TasteZumGedrückthalten = TasteZumGedrückthaltenVorher) <em>; Die korrekte Taste ist bereits unten (oder keine Taste notwendig).</em> return <em>; Nichts tun.</em> <em>; Andernfalls vorherige Taste loslassen und neue Taste gedrückt halten:</em> SetKeyDelay -1 <em>; Verzögerungen zwischen Tastendrücke verhindern.</em> if TasteZumGedrückthaltenVorher <em>; Es gibt eine vorherige Taste zum Loslassen.</em> Send, {%TasteZumGedrückthaltenVorher% up} <em>; Taste loslassen.</em> if TasteZumGedrückthalten <em>; Es gibt eine Taste zum Gedrückthalten.</em> Send, {%TasteZumGedrückthalten% down} <em>; Taste gedrückt halten.</em> return</pre> <h3 id="auto-repeating-other">Tastendrücke wiederholt senden</h3> <p>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:</p> <pre>return <em>; Nichts tun.</em></pre> <p>Mit den folgenden Zeilen:</p> <pre>{ if TasteZumGedrückthalten Send, {%TasteZumGedrückthalten% down} <em>; Tastendruck wiederholt senden.</em> return }</pre> <h2 id="Remarks">Bemerkungen</h2> <p>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 <code>2Joy1</code> die erste Taste des zweiten Controllers.</p> <p>Weitere nützliche Controllerskripte finden Sie im <a href="https://www.autohotkey.com/boards/">AutoHotkey-Forum</a>. Verwenden Sie Suchbegriffe wie <em>Controller and GetKeyState and Send</em>, um relevante Themen zu finden.</p> <h2 id="related">Siehe auch</h2> <ul> <li><a href="../scripts/index.htm#ControllerMouse">Controller-zu-Maus-Skript (Controller als Maus verwenden)</a></li> <li><a href="../KeyList.htm#Controller">Alle Tasten, Achsen und Bedienelemente eines Controllers</a></li> <li><a href="../lib/GetKeyState.htm">GetKeyState</a></li> <li><a href="Remap.htm">Neubelegung von Tastatur und Maus</a></li> </ul> </body> </html>