Wie man Tastendrücke sendet

Send "Hallo, Welt{!}{Left}^+{Left}"

Das Senden von Tastendrücken (oder kurz Tasten) ist die gängigste Methode, um Programme zu automatisieren, da sie am häufigsten funktioniert. Direktere Methoden funktionieren in der Regel nur für bestimmte Applikationen.

Grundsätzlich gibt es zwei Dinge, die man lernen muss, um Tasten zu senden:

  1. Wie man den Code schreibt, damit das Programm weiß, welche Tasten es senden soll.
  2. Wie man die verfügbaren Modi und Optionen verwendet, um das gewünschte Ergebnis zu erzielen.

Sie sollten sich darüber im Klaren sein, dass das Senden einer Taste den Vorgang des physischen Tastendrückens nicht perfekt nachahmt, selbst wenn Sie ihn auf menschliche Geschwindigkeit verlangsamen. Aber bevor wir darauf eingehen, werden wir einige Grundlagen besprechen.

Die Beispiele ausprobieren

Wenn Sie ein Beispiel wie SendText "Hi!" ausführen, wird der Text sofort an das aktive (fokussierte) Fenster gesendet, was kontraproduktiv sein kann, je nachdem, wie Sie das Beispiel ausführen. In der Regel ist es besser, einen Hotkey zu definieren und diesen mit dem Beispiel zu verbinden. Drücken Sie dann den Hotkey, wenn Sie seine Wirkung testen wollen. Einige der folgenden Beispiele verwenden nummerierte Hotkeys wie ^1:: (Strg und eine Zahl, so dass Sie mehrere Beispiele auf einmal ausprobieren können, sofern es keine Duplikate gibt), aber Sie können dies nach Belieben ändern.

Wie Sie die Hotkeys anpassen oder eigene Hotkeys erstellen können, erfahren Sie unter Wie man Hotkeys schreibt.

Wenn Sie nicht genau wissen, wie Sie die Beispiele ausprobieren sollen, lesen Sie Wie man Beispielcodes ausführt.

Wie man den Code schreibt

Wenn Sie Tasten senden, möchten Sie in der Regel entweder eine Taste oder eine Tastenkombination wegen ihrer Wirkung senden (z.B. Strg+C zum Kopieren in die Zwischenablage) oder einen Text eingeben. Die Eingabe von Text ist leichter, also fangen wir damit an: Rufen Sie einfach die SendText-Funktion auf und übergeben Sie ihr den genauen Text, den Sie senden möchten.

^1::SendText "Sehr geehrte Damen und Herren"

Technisch gesehen sendet SendText eigentlich keine Tastendrücke, sondern Unicode-Zeichenpakete, was die Zuverlässigkeit für Zeichen erhöht, die normalerweise mit einer Tastenkombination wie Umschalt+2 oder AltGr+a eingegeben werden.

Anführungszeichen

SendText sendet den Text unverändert, aber unter Berücksichtigung der Sprachregeln. So muss z.B. direkt geschriebener Text in Anführungszeichen gesetzt werden (doppelt " oder einfach '), die von der SendText-Funktion nicht "gesehen" werden. Um ein direkt geschriebenes Anführungszeichen zu senden, umschließen Sie es mit gegenteiligen Anführungszeichen. Zum Beispiel:

^2::SendText 'Anführungszeichen nennt man auch "Gänsefüßchen".'

Alternativ können Sie auch eine Escapesequenz verwenden. Innerhalb einer in Anführungszeichen gesetzten Zeichenkette wird `" in ein direkt geschriebenes " und `' in ein direkt geschriebenes ' übersetzt. Zum Beispiel:

^3::{
    SendText "Doppeltes Anführungszeichen (`")"
    SendText 'Einfaches Anführungszeichen (`')'
}

Die Anführungszeichen können auch abwechselnd gesetzt werden:

^4::SendText 'Doppeltes (") und' . " einfaches (') Anführungszeichen"

Die beiden Zeichenketten werden vor der Übergabe an die SendText-Funktion zusammengefügt (verkettet). Der Punkt (.) kann weggelassen werden, aber dann ist es schwieriger zu erkennen, wo die eine endet und die andere beginnt.

Wie Sie oben bereits gesehen haben, hat das Escapezeichen ` (auch bekannt als umgekehrtes Häkchen, Akzentzeichen oder Gravis) eine besondere Bedeutung. Wenn Sie dieses Zeichen (oder die entsprechende Taste) direkt senden wollen, müssen Sie es verdoppeln, wie in Send "``". Andere gängige Escapesequenzen sind `n für Zeilenvorschub (Enter) und `t für Tabulator. Eine vollständige Liste finden Sie unter Escapesequenzen.

Tasten und Tastenkombinationen senden

SendText ist am besten geeignet, um Text unverändert zu senden, kann aber keine Tasten senden, die keinen Text erzeugen, wie z.B. oder Pos1. Send, SendInput, SendPlay, SendEvent und ControlSend können sowohl Text als auch Tastenkombinationen oder Tasten, die keinen Text erzeugen, senden. Um dies zu ermöglichen, fügen sie den folgenden Symbolen eine besondere Bedeutung hinzu: ^!+#{}

Die ersten vier Symbole sind die regulären Modifikatortasten: Strg (^), Alt (!), Umschalt (+) und Win (#). Diese können kombiniert werden, wirken sich aber sonst nur auf die nächste Taste aus.

Um eine Taste per Namen zu senden oder um eines der oben genannten Symbole direkt zu senden, umschließen Sie die Taste oder das Symbol mit geschweiften Klammern. Zum Beispiel:

Wenn Sie Strg+Umschalt+" drücken, wird das folgende Beispiel zwei Anführungszeichen senden und den Textcursor nach links verschieben, so dass Sie sofort etwas zwischen die Anführungszeichen schreiben können:

^+"::Send '""{Left}'

Alle anderen Zeichen außer ^!+#{} werden von Send in die entsprechende Tastenkombination umgewandelt und dann gedrückt und losgelassen. Zum Beispiel bewirkt Send "aB", dass A gedrückt und losgelassen wird und dann Umschalt+B gedrückt und losgelassen wird. Ebenso wird jeder Tastenname in geschweiften Klammern standardmäßig gedrückt und losgelassen. Zum Beispiel bewirkt Send "{Ctrl}a", dass Strg gedrückt und losgelassen wird und dann A gedrückt und losgelassen wird; vermutlich nicht das, was Sie wollen.

Um eine Taste nur zu drücken (gedrückt zu halten) oder nur loszulassen, umschließen Sie den Tastennamen mit geschweiften Klammern, gefolgt von einem Leerzeichen und dem Wort "down" oder "up". Das folgende Beispiel bewirkt, dass Strg+Feststell als Schalter für Umschalt fungiert:

*^CapsLock::{
    if GetKeyState("Shift")
        Send "{Shift up}"
    else
        Send "{Shift down}"
}

Hotkeys vs. Send

Warnung: Es gibt einige Unterschiede zwischen Hotkeys und Send, die Sie wissen sollten.

Obwohl Hotkeys auch die Symbole ^!+# und die Tastennamen verwenden, gibt es einige wichtige Unterschiede:

Der Grund dafür ist, dass Send für mehrere Zwecke gedacht ist, während Hotkeys für Tastenkombinationen optimiert sind.

Ergänzend sei angemerkt, dass Hotstrings ausschließlich der Erkennung von Texteingaben dienen, so dass die Symbole ^!+#{} innerhalb des Auslösetextes keine besondere Bedeutung haben. Allerdings verwendet der Ersatztext eines Hotstrings die gleiche Syntax wie Send (außer bei Verwendung der T-Option). Jedes Mal, wenn Sie "{" eingeben, während der folgende Hotstring aktiv ist, sendet er "}" und dann , um den Textcursor wieder zwischen die geschweiften Klammern zu setzen:

:*?B0:{::{}}{Left}

Blind-Modus

Normalerweise geht Send davon aus, dass alle Modifikatortasten, die Sie physisch gedrückt halten, nicht mit den zu sendenden Tasten kombiniert werden sollen. Wenn Sie z.B. Strg gedrückt halten und Send "Hi" aufrufen, wird Send Strg automatisch loslassen, bevor es "Hi" sendet, und sie danach wieder nach unten drücken.

Manchmal möchten Sie bestimmte Tasten in Kombination mit anderen Modifikatoren senden, die Sie zuvor gedrückt oder gesendet haben. Verwenden Sie dafür das {Blind}-Präfix. Versuchen Sie unter Verwendung des folgenden Beispiels, einen nicht-leeren Texteditor oder ein nicht-leeres Eingabefeld zu fokussieren und 1 oder 2 zu drücken, während Sie Strg oder Strg+Umschalt gedrückt halten:

*^1::Send "{Blind}{Home}"
*^2::Send "{Blind}{End}"

Weitere Informationen zu {Blind} finden Sie unter Blind-Modus.

Sonstige

Send unterstützt einige andere spezielle Konstrukte, wie zum Beispiel:

Eine vollständige Liste finden Sie unter Tastennamen.

Modi und Optionen

Das Senden einer Taste ahmt den Vorgang des physischen Tastendrückens nicht perfekt nach. Das Betriebssystem bietet verschiedene Möglichkeiten zum Senden von Tasten, für die es jeweils unterschiedliche Vorbehalte gibt. Für das gewünschte Ergebnis ist es nicht nur wichtig, verschiedene Methoden auszuprobieren, sondern auch das Timing zu optimieren.

Die Hauptmethoden sind SendInput, SendEvent und SendPlay. SendInput ist in der Regel die zuverlässigste Methode, daher ist Send standardmäßig synonym mit SendInput. SendMode kann verwendet werden, um Send stattdessen synonym mit SendEvent oder SendPlay zu machen. Weitere Vor- und Nachteile von SendInput und SendPlay sind in der Dokumentation ausführlich beschrieben, aber ich rate Ihnen, einfach SendEvent oder SendPlay auszuprobieren, wenn Sie Probleme mit SendInput haben.

Warnung: SendPlay funktioniert in der Regel nicht in modernen Systemen, es sei denn, Sie verwenden UI-Access.

Ein weiterer lohnenswerter Kandidat ist ControlSend, das keine offizielle Methode zum Senden von Tastendrücken verwendet, sondern stattdessen Meldungen direkt an das von Ihnen angegebene Fenster sendet. Dies hat vor allem den Vorteil, dass das Fenster in der Regel nicht aktiv sein muss, um diese Meldungen zu empfangen. Da es aber die normale Verarbeitung der systeminternen Tastatureingabe umgeht, funktioniert es manchmal nicht.

Timing und Verzögerungen

Manchmal ist es möglich, eine Flut von Tastendrücken schneller als ein Mensch zu senden, manchmal aber auch nicht. In der Regel gibt es zwei Situationen, in denen eine Verzögerung nützlich sein kann:

Für den ersten Punkt können Sie einfach Send, dann Sleep, dann Send usw. verwenden.

Für den zweiten Punkt können Sie SetKeyDelay verwenden. Diese Funktion bestimmt die Verzögerung zwischen jedem Tastendruck und die Dauer des Tastendrucks (also die Verzögerung zwischen Drücken und Loslassen der Taste).

^1::{
    SetKeyDelay 75, 25  ; 75ms zwischen Tasten, 25ms zwischen unten/oben.
    SendEvent "Die Tasten{bs 6}Zeichen sollten nacheinander erscheinen."
}

Warnung: SendInput unterstützt keine Tastenverzögerung, ebenso wenig wie das reguläre Send.

SetKeyDelay funktioniert grundsätzlich nur, wenn Sie entweder SendMode "Event" verwenden oder SendEvent, SendPlay oder ControlSend anstelle von Send oder SendText aufrufen.

Sehr viel Text senden

Mehrere Textzeilen können z.B. mithilfe eines Fortsetzungsbereichs gesendet werden:

SendText "
(
    Einrückungen werden entfernt,
    basierend auf der ersten Zeile.
    Zeilenumbrüche bleiben erhalten,
    es sei denn, Sie verwenden die Join-Option.
)"

Obwohl SendText in der Regel recht schnell ist, muss es immer noch jedes Zeichen einzeln senden, während Send in der Regel mindestens doppelt so viele Meldungen senden muss (Taste-Unten und Taste-Oben). Dies führt zu einer merklichen Verzögerung, wenn sehr viel Text gesendet wird. Außerdem kann die Zuverlässigkeit darunter leiden, denn je länger die Verzögerung, desto größer ist das Risiko, dass es zu Konflikten mit Benutzereingaben kommt, sich der Tastaturfokus verschiebt oder sich andere Bedingungen ändern.

In der Regel ist es schneller und zuverlässiger, den Text in die Zwischenablage zu kopieren und einzufügen. Zum Beispiel:

^1::{
    old_clip := ClipboardAll()  ; Zwischenablage speichern
    A_Clipboard := "
    (Join`s
        Dieser Text befindet sich in der Zwischenablage
        und wird unten mit Strg+V eingefügt.
    )"
    Send "^v"
    Sleep 500  ; Kurz warten, bis Strg+V verarbeitet wurde
    A_Clipboard := old_clip  ; Vorherige Zwischenablage wiederherstellen
}