Input

Wartet darauf, dass der Benutzer eine Zeichenkette eingibt.

Input , AusgabeVar, Optionen, EndTasten, VergleichListe

Parameter

AusgabeVar

Name der Ausgabevariable, in der die Benutzereingabe gespeichert werden soll (standardmäßig werden künstliche Eingaben auch erfasst).

Lässt man diesen und die anderen Parameter weg, wird jede Eingabeerfassung, die in einem anderen Thread gerade im Gange ist, beendet und ErrorLevel auf das Wort NewInput gesetzt. Der ErrorLevel-Wert des aktuellen Befehls wird dagegen auf 0 gesetzt, wenn er eine vorherige Eingabeerfassung beenden konnte, oder auf 1, wenn es keine vorherige Eingabeerfassung gab, die er beenden konnte.

AusgabeVar wird an sich keine Tastendrücke enthalten. Stattdessen enthält es Zeichen, die via Tastendruck erzeugt wurden, abhängig vom Tastaturlayout und/oder der Sprache des aktiven Fensters. Tastendrücke, die keine Zeichen erzeugen (wie z. B. Bild↑ und Pos1), werden dementsprechend nicht gespeichert (allerdings können sie via EndTasten-Parameter erkannt werden).

Hinweis: Esc wird in das ASCII-ESC-Zeichen Chr(27) umgewandelt. Um das zu verhindern, fügen Sie {Esc} in EndTasten ein, damit die Eingabeerfassung mit Esc beendet werden kann.

Leerraumzeichen wie z. B. Tab (`t) werden als direkt geschriebener Text gespeichert. Enter als LF-Zeichen (`n).

Optionen

Eine Zeichenkette mit null oder mehreren der folgenden Buchstaben (in beliebiger Reihenfolge, optional mit Leerzeichen getrennt):

B: Backspace wird ignoriert. Normalerweise wird, wenn man während einer Eingabeerfassung Backspace drückt, das zuletzt gedrückte Zeichen am Ende der Zeichenkette entfernt. Hinweis: Ist der Eingabetext sichtbar (wie z. B. in einem Texteditor) und werden die Pfeiltasten oder andere Mittel zum Navigieren innerhalb des Textes verwendet, wird Backspace weiterhin das letzte Zeichen entfernen, anstelle des Zeichens nach der Einfügemarke.

C: Groß-/Kleinschreibung-sensitiv. Normalerweise ist VergleichListe nicht Groß-/Kleinschreibung-sensitiv (in den Versionen vor 1.0.43.03 wurden nur die Groß- und Kleinbuchstaben von A bis Z erkannt, aber nicht Buchstaben wie ü/Ü).

I: Ignoriert Eingaben, die von SendEvent erzeugt werden, bei einer Sendestufe von 0. Allerdings werden SendInput und SendPlay immer ignoriert, egal ob diese Einstellung aktiv ist oder nicht. [v1.1.31+]: Nach dem Optionsbuchstaben kann eine Zahl erfolgen, um die minimale Sendestufe zu bestimmen. I und I1 sind äquivalent. I0 ist das gleiche wie, als würde die Option fehlen.

L: Längenbegrenzung (z. B. L5). Die maximal erlaubte Länge der Eingabe. Wenn der Text diese Länge erreicht, wird die Eingabeerfassung beendet und ErrorLevel auf das Wort Max gesetzt, es sei denn, der Text stimmt mit einem der Elemente in VergleichListe überein, dann wird ErrorLevel auf das Wort Match gesetzt. Wenn diese Option nicht verwendet wird, ist die Länge auf 16383 Zeichen begrenzt, was auch der höchste zulässige Wert in Versionen vor [v1.1.31] ist.

M: Modifizierte Tastendrücke wie Strg+A bis Strg+Z werden erkannt und in echte ASCII-Zeichen umgewandelt, falls möglich. Das folgende Beispiel zeigt, wie Strg+C erkannt werden kann:

StrgC := Chr(3) ; Speichert das Zeichen für STRG+C in die Variable StrgC.
Input, AusgabeVar, L1 M
if (AusgabeVar = StrgC)
    MsgBox, Sie haben STRG+C gedrückt.
ExitApp

Hinweis: Strg+A bis Strg+Z sind die Zeichen von Chr(1) bis Chr(26). Außerdem ist es möglich, dass die M-Option einige Tastaturkurzbefehle wie Strg+ dazu bringen kann, sich während einer Eingabeerfassung falsch zu verhalten.

T: Zeitlimit (z. B. T3). Die zu wartenden Sekunden, bevor die Eingabeerfassung beendet und ErrorLevel auf das Wort Timeout gesetzt wird. Hat die Eingabeerfassung die Zeit überschritten, wird AusgabeVar auf das gesetzt, was auch immer der Benutzer gerade eingegeben hat. Dieser Wert kann eine Floating-Point-Zahl wie z. B. 2.5 sein.

V: Sichtbar. Normalerweise wird die Eingabe des Benutzers blockiert (unsichtbar für das Betriebssystem gemacht). Nutzen Sie diese Option, damit die Tastendrücke des Benutzers direkt an das aktive Fenster gesendet werden.

*: Platzhalter (überall finden). Normalerweise muss alles, was der Benutzer eingibt, exakt mit einem Element aus der VergleichListe übereinstimmen, damit der Input fortfahren kann. Verwenden Sie diese Option, um im gesamten Eingabetext eine Übereinstimmung häufiger finden zu können.

E [v1.1.20+]: Behandelt Einzelzeichen-Endungstasten als Zeichencode anstatt als Tastencode. Diese Änderung ermöglicht konsistentere Ergebnisse, wenn das Tastaturlayout des aktiven Fensters sich vom Tastaturlayout des Skripts unterscheidet. Es verhindert auch Tastenkombinationen, die die angegebenen Endungszeichen bei der Eingabe eigentlich nicht erzeugen können; wenn @ beispielsweise eine Endungstaste wäre, würde sie auf einem US-Layout via Umschalt+2 ausgelöst werden, aber nicht via Strg+Umschalt+2 (wenn die E-Option verwendet wird). Wenn zusätzlich noch die C-Option angegeben ist, ist das Endungszeichen Groß-/Kleinschreibung-sensitiv.

EndTasten

Eine Liste mit keine oder mehr Tasten, die die Eingabeerfassung beenden können, sobald eine von diesen gedrückt wird (die Endtaste selbst wird nicht in AusgabeVar geschrieben). Eine auf diese Weise beendete Eingabeerfassung setzt ErrorLevel auf das Wort EndKey, gefolgt von einem Doppelpunkt und den Namen der Endtaste. Beispiele: EndKey:., EndKey:Escape.

Die Endtasten-Liste verwendet ein Format, das Ähnlichkeit zum verwendeten Format im Send-Befehl hat. Zum Beispiel würde {Enter}.{Esc} bewirken, dass Enter, . oder Esc die Eingabeerfassung beenden können. Um die geschweiften Klammern als Endtasten zu definieren, geben Sie {{} und/oder {}} an.

Um Strg, Alt oder Umschalt als Endtasten zu definieren, geben Sie die linke und/oder rechte Version der Taste an, nicht die neutrale Version. Zum Beispiel müsste {LControl}{RControl} anstelle von {Control} angegeben werden.

[v1.0.14+]: Zwar werden Tastenkombinationen wie Alt+C (!c) nicht unterstützt, allerdings können bestimmte Zeichen, die das Gedrückthalten von Umschalt erfordern - also Satzzeichen wie z. B. ?!:@&{} - verwendet werden. [v1.1.20+]: Andere Zeichen in Verbindung mit der oben beschriebenen E-Option werden unterstützt. Wenn sowohl die E- als auch M-Option vorhanden sind, werden Tastenkombinationen von Strg+A bis Strg+Z unterstützt, indem man die entsprechenden ASCII-Steuerzeichen in EndTasten einfügt.

Ein eindeutiger virtueller Tastencode wie {vkFF} könnte man auch angeben. Diese Angabe ist in Ausnahmefällen nützlich, wo eine Taste keinen Namen hat und keine sichtbaren Zeichen beim Drücken erzeugt. Der virtuelle Tastencode einer solchen Taste kann durch Befolgen der Schritte am unteren Ende der Tastenliste ermittelt werden.

VergleichListe

Eine kommagetrennte Liste mit Stichwörtern, die die Eingabeerfassung beenden können (in diesem Fall wird ErrorLevel auf das Wort Match gesetzt). Alles, was der Benutzer eingibt, muss exakt mit einem Element aus der Liste übereinstimmen, damit der Input fortfahren kann (sofern die *-Option nicht vorhanden ist). Alle Leer- und Tabulatorzeichen an den angrenzenden Kommas sind von Bedeutung - das heißt, dass sie ein Teil der Übereinstimmungszeichenkette sind. Wenn VergleichListe beispielsweise ABC , XYZ wäre, kann eine Übereinstimmung nur erfolgen, wenn der Benutzer ein Leerzeichen nach ABC oder vor XYZ eingibt.

Zwei aufeinanderfolgende Kommas ergeben ein direkt geschriebenes Komma. Zum Beispiel würde die folgende Zeile ein direkt geschriebenes Komma nach dem Wort Zkette1 erzeugen: Zkette1,,,Zkette2. Im Vergleich dazu würde die folgende Liste nur ein einzelnes Element mit einem direkt geschriebenen Komma dazwischen enthalten: einzelnes,,Element.

Da die Elemente in VergleichListe nicht als einzelne Parameter behandelt werden, kann die Liste komplett in einer Variable enthalten sein. Diese Methode ist sowieso notwendig, wenn die Liste eine Länge von 16383 Zeichen überschreitet (die maximale Länge einer Skriptzeile). Zum Beispiel könnte VergleichListe aus %Liste1%,%Liste2%,%Liste3% bestehen, von der jede Unterliste eine lange Liste mit Elementen enthält.

Fehlerbehandlung

[v1.1.04+]: Dieser Befehl ist in der Lage, eine Ausnahme auszulösen, wenn er ohne Parameter aufgerufen wird oder wenn keine Eingabeerfassung im Gange ist. Weitere Informationen finden Sie unter Laufzeitfehler.

ErrorLevel wird auf einen der folgenden Werte gesetzt:

Wert Beschreibung

1 oder 0

Wenn der Befehl ohne Parameter verwendet wird, wird ErrorLevel auf 0 gesetzt, wenn er erfolgreich eine vorherige Eingabeerfassung beenden konnte, oder auf 1, wenn es keine vorherige Eingabeerfassung gab, die er beenden konnte.

NewInput Die Eingabeerfassung wurde von einem anderen Thread unterbrochen, der den Input-Befehl verwendet hat.
Max Die Eingabeerfassung hat die maximal erlaubte Länge erreicht und stimmt mit keinem der Elemente in VergleichListe überein.
Timeout Die Eingabeerfassung hat die Zeit überschritten.
Match Die Eingabeerfassung stimmt mit einem der Elemente in VergleichListe überein.
EndKey:Name

Eine der EndTasten wurde gedrückt, um die Eingabeerfassung zu beenden. In diesem Fall wird ErrorLevel auf das Wort EndKey gesetzt, gefolgt von einem Doppelpunkt und den Namen der Endtaste ohne geschweifte Klammern, z. B. EndKey:Enter, EndKey:Escape, etc.

Beachten Sie, dass Name der "normalisierte" Name der Taste ist, egal wie sie in EndTasten geschrieben wurde. Zum Beispiel würde sowohl {Esc} als auch {vk1B} EndKey:Escape erzeugen. Mit GetKeyName() kann der normalisierte Name abgerufen werden.

Wenn die E-Option verwendet wurde, wird Name das aktuell eingegebene Zeichen sein (falls zutreffend). Ansonsten wird der Name auf Basis des aktiven Tastaturlayouts vom Skript bestimmt.

Vor [v1.1.20], wenn der VK-Code der Endungstaste im Bereich von 0x41 (A) bis 0x5A (Z) war, enthielt ErrorLevel üblicherweise das entsprechende ASCII-Zeichen, selbst wenn es nicht für das aktuelle Tastaturlayout korrekt war. In [v1.1.20] und höher wird das korrekte Zeichen verwendet. Verwendet man ein Zeichen im Bereich von A bis Z, wird es aus Gründen der Rückwärtskompatibilität großgeschrieben sein; ansonsten in der Regel kleingeschrieben.

Bemerkungen

Verwendet man diesen Befehl, während eine Eingabeerfassung in einem anderen Thread bereits im Gange ist, wird diese Eingabeerfassung beendet und ErrorLevel auf das Wort NewInput gesetzt. Danach wird die neue Eingabeerfassung eingeleitet (sofern Parameter angegeben sind).

Während eine Eingabeerfassung im Gange ist, können neue Threads wie benutzerdefinierte Menüelemente oder zeitgesteuerte Subroutinen erstellt werden.

Tastatur-Hotkeys bleiben wirksam, während eine Eingabeerfassung im Gange ist, aber sie können nicht ausgelöst werden, wenn eine der erforderlichen Modifikatortasten unterdrückt ist oder wenn der Hotkey die reg-Methode verwendet und seine Suffix-Taste unterdrückt ist. Der Hotkey ^+a:: beispielsweise könnte von Input überschrieben werden, während $^+a:: gegenüber Input Vorrang hätte.

Wenn die Eingabeerfassung nicht sichtbar ist, werden alle Tasten unterdrückt, außer reguläre Modifikatortasten, CapsLock, NumLock und ScrollLock. Sogar EndTasten und Tastendrücke, die AusgabeVar nicht verändern, werden unterdrückt. Zum Beispiel hat Pos1 keinen Effekt, während LWin+D das Startmenü öffnet (weil D unterdrückt wird und LWin nicht)

Wenn ein Skript diesen Befehl zum ersten Mal verwendet, wird der Tastatur-Hook installiert (falls noch nicht geschehen). Darüber hinaus wird das Skript persistent; das heißt, dass das Skript nur noch mit ExitApp terminiert werden kann. Jedes Mal, wenn das Skript einen Suspend- oder Hotkey-Befehl erreicht, wird überprüft, ob der Tastatur-Hook noch von Hotkeys oder Hotstrings beansprucht wird. Ist dies nicht der Fall, wird der Hook wieder deinstalliert.

Wenn Sie mehrere Sprachen oder Tastaturlayouts verwenden, greift die Eingabeerfassung auf das Tastaturlayout des aktiven Fensters statt auf die des Skripts zurück (egal ob die Eingabeerfassung sichtbar ist oder nicht). In den Versionen vor 1.0.44.03 wurde die Belegung des Skripts verwendet.

Trotz ihrer geringeren Flexibilität sind Hotstrings in der Regel einfach zu bedienen als der Input-Befehl.

InputHook() ist flexibler als der Input-Befehl.

KeyWait, Hotstrings, InputBox, #InstallKeybdHook, Threads, if Var in/contains VergleichListe

Beispiele

Wartet darauf, dass der Benutzer eine Taste drückt. Tasten, die keine sichtbaren Zeichen erzeugen (z. B. Modifikatortasten, Funktionstasten, Pfeiltasten), sind als Endtasten aufgelistet, so dass auch diese erkannt werden.

Input, EinzelTaste, L1, {LControl}{RControl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{RWin}{AppsKey}{F1}{F2}{F3}{F4}{F5}{F6}{F7}{F8}{F9}{F10}{F11}{F12}{Left}{Right}{Up}{Down}{Home}{End}{PgUp}{PgDn}{Del}{Ins}{BS}{CapsLock}{NumLock}{PrintScreen}{Pause}

Dies ist ein funktionierendes Hotkey-Beispiel. Da der Hotkey über das Tildepräfix (~) verfügt, wird sein eigener Tastendruck an das aktive Fenster weitergereicht. Schreibt man daher <btw (oder einen der anderen Begriffe) in einem Texteditor, wird das Skript automatisch eine Aktion Ihrer Wahl durchführen (z. B. den Eingabetext ersetzen). Eine alternative Version dieses Beispiels finden Sie unter Switch.

~<::
Input, BenutzerEingabe, V T5 L4 C, {enter}.{esc}{tab}, btw,otoh,fl,ahk,ca
if (ErrorLevel = "Max")
{
    MsgBox, Ihre Eingabe "%BenutzerEingabe%" hat die maximale Textlänge erreicht.
    return
}
if (ErrorLevel = "Timeout")
{
    MsgBox, Sie haben "%BenutzerEingabe%" innerhalb der verfügbaren Zeit eingegeben.
    return
}
if (ErrorLevel = "NewInput")
    return
If InStr(ErrorLevel, "EndKey:")
{
    MsgBox, Sie haben "%BenutzerEingabe%" eingegeben und Eingabe mit %ErrorLevel% beendet.
    return
}
; Ansonsten wurde eine Übereinstimmung gefunden.
if (BenutzerEingabe = "btw")
    Send, {backspace 4}by the way
else if (BenutzerEingabe = "otoh")
    Send, {backspace 5}on the other hand
else if (BenutzerEingabe = "fl")
    Send, {backspace 3}Florida
else if (BenutzerEingabe = "ca")
    Send, {backspace 3}California
else if (BenutzerEingabe = "ahk")
    Run, https://www.autohotkey.com
return