InputHook() [v1.1.31+]

Erstellt ein Objekt, das zum Erfassen oder Abfangen von Tastatureingaben genutzt werden kann.

InputHook := InputHook(Optionen, Endtasten, Vergleichsliste)

Parameter

Optionen

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

B: Setzt BackspaceIsUndo auf False, um zu bewirken, dass Backspace ignoriert wird.

C: Setzt CaseSensitive auf True, um Vergleichsliste Groß-Kleinschreibung-sensitiv zu machen.

I: Setzt MinSendLevel auf 1 oder den angegebenen Wert, um Eingaben zu ignorieren, deren Sendestufe kleiner als dieser Wert ist. I2 beispielsweise würde Eingaben mit einer Stufe von 0 (Standardwert) oder 1 ignorieren, aber Eingaben der Stufe 2 erfassen.

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 EndReason auf das Wort Max gesetzt (es sei denn, der Text stimmt mit einem der Elemente in der Vergleichsliste überein, dann wird EndReason auf das Wort Match gesetzt). Wenn diese Option nicht verwendet wird, ist die Länge auf 1023 Zeichen begrenzt.

Die Angabe von L0 deaktiviert die Texterfassung und Längenlimitierung, hat aber keinen Einfluss darauf, welche Tasten tatsächlich Text erzeugen (siehe VisibleText). Dies kann in Zusammenhang mit OnChar, OnKeyDown, KeyOpt oder EndKeys nützlich sein.

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.
ih := InputHook("L1 M")
ih.Start()
ih.Wait()
if (ih.Input = StrgC)
    MsgBox, Sie haben STRG+C gedrückt.

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 Tastenkürzel wie Strg+ dazu bringen kann, sich während einer Eingabeerfassung falsch zu verhalten.

T: Setzt Timeout (z. B. T3 oder T2.5).

V: Setzt VisibleText und VisibleNonText auf True. 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. Setzt FindAnywhere auf True, damit überall Übereinstimmungen innerhalb dessen, was der Benutzer eingibt, gefunden werden können.

E: 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 optionale Liste mit ein oder mehr Tasten, die, wenn gedrückt, die Eingabeerfassung beenden können (die Endtaste selbst wird nicht in den Eingabepuffer geschrieben). Wenn eine Eingabeerfassung auf diese Weise beendet wird, wird EndReason auf das Wort EndKey und die EndKey-Eigenschaft auf den Namen der Taste gesetzt.

Die Endtasten-Liste verwendet ein Format, das Ähnlichkeit zum verwendeten Format des Send-Befehls hat. Zum Beispiel würde {Enter}.{Esc} bewirken, dass Enter, . oder Esc die Eingabeerfassung beenden können. Damit die geschweiften Klammern selbst Endtasten sein können, gibt man {{} und/oder {}} an.

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

Obwohl modifizierte Tasten wie Alt+C (!c) nicht unterstützt werden, setzen nicht-alphanumerische Zeichen wie ?!:@&{} standardmäßig voraus, dass UMSCHALT gedrückt oder nicht gedrückt sein muss, je nachdem, wie das Zeichen normalerweise eingegeben wird. Wenn die E-Option vorhanden ist, werden die Namen von Einzelzeichentasten stattdessen als Zeichen interpretiert - in solchen Fällen müssen die Modifikatortasten im richtigen Zustand sein, um dieses Zeichen zu erzeugen. 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 Tastencode wie {vkFF} oder {sc001} kann auch angegeben werden. 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.

Vergleichsliste

Eine kommagetrennte Liste mit Stichwörtern, die die Eingabeerfassung beenden können (in diesem Fall wird EndReason auf das Wort Match gesetzt). Alles, was der Benutzer eingibt, muss exakt mit einem Element aus der Liste übereinstimmen, um eine Übereinstimmung zu bewirken (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 Vergleichsliste 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 Zeichenkette1 erzeugen: Zeichenkette1,,,Zeichenkette2. 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 Vergleichsliste 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 Vergleichsliste aus %Liste1%,%Liste2%,%Liste3% bestehen, von der jede Unterliste eine lange Liste mit Elementen enthält.

Input-Stapel

Es können beliebig viele InputHook-Objekte erstellt werden und zur selben Zeit aktiv sein, allerdings hat die Reihenfolge, in der sie gestartet werden, Einfluss darauf, wie die Eingaben erfasst werden.

Wenn eine Eingabeerfassung gestartet wird (via Start-Methode oder Input-Befehl), wird sie ganz oben auf den Stapel geschoben, und aus diesem Stapel entfernt, wenn die Eingabeerfassung beendet wird. Die Reihenfolge, in der die Tastaturereignisse an eine Eingabeerfassung übergeben werden, geht vom neuesten zum ältesten. Wenn eine Eingabeerfassung ein bestimmtes Tastaturereignis unterdrückt, wird er nicht weiter im Stapel nach unten verschoben.

Gesendete Tastendrücke werden ignoriert, wenn die Sendestufe des Tastendrucks unterhalb des InputHook's MinSendLevel liegt. In solchen Fällen kann der Tastendruck immer noch von einer Eingabeerfassung verarbeitet werden, der niedriger auf dem Stapel liegt.

Es können mehrere InputHooks in Kombination mit MinSendLevel genutzt werden, um sowohl gesendete als auch reale Tastendrücke separat zu erfassen.

Der Aufruf des Input-Befehls beendet jede vorherige via Input-Befehl gestartete Eingabeerfassung, lässt aber alle InputHooks aktiv. Wenn die Eingabeerfassung nicht sichtbar ist, werden alle InputHooks, die davon unterbrochen werden, grundsätzlich keine Eingaben erfassen, bis der Input-Befehl fertig ist.

InputHook-Objekt

Die InputHook-Funktion gibt ein InputHook-Objekt zurück, das die folgenden Methoden und Eigenschaften hat.

Methoden:

Allgemeine Eigenschaften:

Optionseigenschaften:

KeyOpt

Setzt Optionen für eine Taste oder Tastenliste.

InputHook.KeyOpt(Tasten, Tastenoptionen)
Tasten

Eine Liste mit Tasten. Geschweifte Klammern werden genutzt, um Tastennamen, virtuelle Tastencodes oder Scancodes zu umschließen, ähnlich dem Send-Befehl. {Enter}.{{} beispielsweise gilt für die Tasten Enter, . und {. Die Angabe einer Taste via Name, {vkNN} oder {scNNN} kann zu drei verschiedenen Ergebnissen führen; siehe unten für Details.

Geben Sie nur die Zeichenkette {All} an (nicht Groß-/Kleinschreibung-sensitiv), um Tastenoptionen auf alle VK und SC anzuwenden. KeyOpt kann dann ein zweites Mal aufgerufen werden, um Optionen von bestimmten Tasten zu entfernen.

Tastenoptionen

Eine oder mehrere der folgenden einstelligen Optionen (Leer- und Tabulatorzeichen werden ignoriert).

- (minus): Entfernt alle Optionen nach dem -, bis zum nächsten +.

+ (plus): Bricht alle vorherigen - ab, ansonsten kein Effekt.

E: Endtaste. Wenn diese Option aktiv ist, wird beim Drücken der Taste die Eingabeerfassung beendet, EndReason auf das Wort EndKey gesetzt und die EndKey-Eigenschaft auf den normalisierten Namen der Taste gesetzt. Im Gegensatz zum EndKeys-Parameter wird der Zustand von UMSCHALT ignoriert. Zum Beispiel sind @ und 2 im US-amerikanischen Tastaturlayout äquivalent zu {vk32}.

I: Text ignorieren. Jeglicher Text, den diese Taste normalerweise erzeugt, wird ignoriert, außerdem wird die Taste als Nicht-Text-Taste behandelt (siehe VisibleNonText). Hat keine Wirkung, wenn die Taste von sich aus keinen Text erzeugt.

N: Benachrichtigen. Bewirkt, dass jedes Mal die Callbacks OnKeyDown und OnKeyUp aufgerufen werden, wenn die Taste gedrückt wird.

S: Unterdrückt (blockiert) die Taste, nachdem sie verarbeitet wurde. Dies überschreibt VisibleText oder VisibleNonText, bis -S verwendet wird. +S beinhaltet -V.

V: Sichtbar. Verhindert, dass die Taste unterdrückt (blockiert) werden kann. Dies überschreibt VisibleText oder VisibleNonText, bis -V verwendet wird. +V beinhaltet -S.

Optionen können sowohl via virtuellen Tastencode als auch Scancode gesetzt werden und sind kumulativ.

Wenn eine Taste via Name spezifiziert ist, werden die Optionen entweder via VK oder SC gesetzt. Wenn zwei physische Tasten dieselben VK, aber unterschiedliche SC haben (zum Beispiel Up und NumpadUp), werden sie via SC behandelt. Wenn dagegen eine VK-Nummer verwendet wird, gilt sie für alle physischen Tasten, die diese VK erzeugen (aber das kann mit der Zeit variieren, da es vom aktiven Tastaturlayout abhängt).

Das Entfernen einer Option via VK-Nummer hat keinen Einfluss auf Optionen, die via SC gesetzt wurden, oder umgekehrt. Wenn allerdings eine Option via Tastenname entfernt wird und dieser Name via VK behandelt wird, wird die Option auch für den entsprechenden SC entfernt (gemäß dem Tastaturlayout des Skripts). Dies ermöglicht es, Tasten via Name auszuschließen, nachdem eine Option auf alle Tasten angewendet wurde.

Wenn +V via VK und +S via SC gesetzt ist (oder umgekehrt), hat +V Vorrang.

Start

Beginnt die Eingabeerfassung.

InputHook.Start()

Hat keine Wirkung, wenn die Eingabeerfassung bereits im Gange ist.

Die neu gestartete Eingabeerfassung wird ganz oben auf dem InputHook-Stapel platziert, damit diese jede zuvor gestartete Eingabeerfassung überschreiben kann.

Diese Methode installiert den Tastatur-Hook (falls noch nicht geschehen).

Wait

Wartet, bis die Eingabeerfassung beendet wird (InProgress ist False).

InputHook.Wait(MaxZeit)
MaxZeit

Die maximale Wartezeit in Sekunden. Wenn die Eingabeerfassung nach MaxZeit Sekunden immer noch im Gange ist, wird die Methode aufhören zu warten und die Eingabeerfassung nicht beenden.

Rückgabewert: EndReason.

Stop

Beendet die Eingabeerfassung und setzt EndReason auf das Wort Stopped.

InputHook.Stop()

Hat keine Wirkung, wenn die Eingabeerfassung nicht im Gange ist.

EndKey

Gibt den Namen der Endtaste zurück, die zum Beenden der Eingabeerfassung gedrückt wurde.

Tastenname := InputHook.EndKey

Beachten Sie, dass EndKey den "normalisierten" Namen der Taste zurückgibt, egal wie sie in Endtasten geschrieben wurde. {Esc} und {vk1B} beispielsweise erzeugen beide Escape. Mit GetKeyName() kann der normalisierte Name abgerufen werden.

Wenn die E-Option verwendet wurde, wird EndKey das tatsächlich eingegebene Zeichen zurückgegeben (falls zutreffend). Ansonsten wird der Name auf Basis des aktiven Tastaturlayouts vom Skript bestimmt.

EndKey gibt eine leere Zeichenkette zurück, wenn EndReason nicht "EndKey" ist.

EndMods

Gibt eine Zeichenkette mit Modifikatoren zurück, die logisch unten waren, während die Eingabeerfassung beendet wurde.

Mods := InputHook.EndMods

Wenn alle Modifikatoren logisch unten (gedrückt) waren, erhält man die folgende Zeichenkette:

<^>^<!>!<+>+<#>#

Diese Modifikatoren haben die gleiche Bedeutung wie die der Hotkeys. Jeder Modifikator ist immer mit < (links) oder > (rechts) gekennzeichnet. Die zugehörigen Tastennamen sind: LCtrl, RCtrl, LAlt, RAlt, LShift, RShift, LWin, RWin.

Mit InStr() kann überprüft werden, ob ein bestimmter Modifikator (z. B. >! oder ^) vorhanden ist. Die folgende Zeile kann genutzt werden, um Mods in neutrale Modifikatoren umzuwandeln, wie z. B. ^!+#:

Mods := RegExReplace(Mods, "[<>](.)(?:>\1)?", "$1")

Aufgrund des sehr präzisen Timings ist diese Eigenschaft grundsätzlich zuverlässiger als GetKeyState, sogar wenn diese unmittelbar nach Beendigung der Eingabeerfassung oder im OnEnd-Callback verwendet wird.

EndReason

Gibt eine EndReason-Zeichenkette zurück, die angibt, wie die Eingabeerfassung beendet wurde.

Grund := InputHook.EndReason

Gibt eine leere Zeichenkette zurück, wenn die Eingabeerfassung noch im Gange ist.

InProgress

Gibt True zurück, wenn die Eingabeerfassung im Gange ist, ansonsten False.

BoolescherWert := InputHook.InProgress

Input

Gibt den erfassten Text seit dem letzten Start der Eingabeerfassung zurück.

Zeichenkette := InputHook.Input

Diese Eigenschaft kann genutzt werden, während die Eingabeerfassung im Gange ist oder nachdem sie beendet wurde.

Match

Gibt das Element der Vergleichsliste zurück, mit der die Eingabeerfassung beendet wurde.

Zeichenkette := InputHook.Match

Rückgabewert: Das gefundene Element mit originaler Groß-/Kleinschreibung, die sich von dem unterscheiden kann, was der Benutzer eingegeben hat, wenn die C-Option weggelassen wurde. Gibt eine leere Zeichenkette zurück, wenn EndReason nicht "Match" ist.

OnEnd

Ermittelt oder setzt das Funktionsobjekt, das aufgerufen wird, wenn die Eingabeerfassung beendet wird.

MeinFunk := InputHook.OnEnd
InputHook.OnEnd := MeinFunk

Typ: Funktionsobjekt oder leere Zeichenkette. Standard: leere Zeichenkette.

Die Funktion akzeptiert einen Parameter: eine Referenz zum InputHook-Objekt.

Die Funktion wird als neuer Thread aufgerufen, demzufolge verwendet sie zu Beginn die Standardwerte von Einstellungen wie SendMode und DetectHiddenWindows.

OnChar

Ermittelt oder setzt das Funktionsobjekt, das aufgerufen wird, nachdem ein Zeichen zum Eingabepuffer hinzugefügt wurde.

MeineFunk := InputHook.OnChar
InputHook.OnChar := MeineFunk

Typ: Funktionsobjekt oder leere Zeichenkette. Standard: leere Zeichenkette.

Die Funktion akzeptiert folgende Parameter: InputHook, Char. Char ist eine Zeichenkette, die das oder die Zeichen enthält.

Mehrere Zeichen sind ein Hinweis darauf, dass vor dem letzten Tastendruck eine tote Taste verwendet wurde, aber die beiden Tasten nicht zu einem einzigen Zeichen transliteriert (umgewandelt) werden konnten. Auf einigen Tastaturlayouts erzeugt `e beispielsweise è, während `z `z erzeugt.

Die Funktion wird nie aufgerufen, wenn eine Endtaste gedrückt wird.

OnKeyDown

Ermittelt oder setzt das Funktionsobjekt, das aufgerufen wird, wenn eine benachrichtigungsfähige Taste gedrückt wird.

MeineFunk := InputHook.OnKeyDown
InputHook.OnKeyDown := MeineFunk

Typ: Funktionsobjekt oder leere Zeichenkette. Standard: leere Zeichenkette.

Taste-Unten-Benachrichtigungen müssen zuerst via KeyOpt oder NotifyNonText aktiviert werden.

Die Funktion akzeptiert folgende Parameter: InputHook, VK, SC. VK und SC sind Integer. Zum Abrufen des Tastennamens (sofern vorhanden) können Sie GetKeyName(Format("vk{:x}sc{:x}", VK, SC)) nutzen.

Die Funktion wird als neuer Thread aufgerufen, demzufolge verwendet sie zu Beginn die Standardwerte von Einstellungen wie SendMode und DetectHiddenWindows.

Die Funktion wird nie aufgerufen, wenn eine Endtaste gedrückt wird.

OnKeyUp [v1.1.32+]

Ermittelt oder setzt das Funktionsobjekt, das aufgerufen wird, wenn eine benachrichtigungsfähige Taste losgelassen wird.

MeineFunk := InputHook.OnKeyUp
InputHook.OnKeyUp := MeineFunk

Typ: Funktionsobjekt oder leere Zeichenkette. Standard: leere Zeichenkette.

Taste-Oben-Benachrichtigungen müssen zuerst via KeyOpt oder NotifyNonText aktiviert werden. Inwieweit eine Taste als Text oder Nicht-Text gilt, wird beim Drücken der Taste ermittelt. Wenn ein InputHook ein Taste-Oben-Ereignis erkennt, ohne vorher Taste-Unten erkannt zu haben, wird die Taste als Nicht-Text gewertet.

Die Funktion akzeptiert folgende Parameter: InputHook, VK, SC. VK und SC sind Integer. Zum Abrufen des Tastennamens (sofern vorhanden) können Sie GetKeyName(Format("vk{:x}sc{:x}", VK, SC)) nutzen.

Die Funktion wird als neuer Thread aufgerufen, demzufolge verwendet sie zu Beginn die Standardwerte von Einstellungen wie SendMode und DetectHiddenWindows.

BackspaceIsUndo

Legt fest, ob Backspace das zuletzt gedrückte Zeichen am Ende des Eingabepuffers entfernen soll.

BoolescherWert := InputHook.BackspaceIsUndo
InputHook.BackspaceIsUndo := BoolescherWert

Typ: Integer (boolescher Wert). Standard: True. Die B-Option setzt den Wert auf False.

Wenn Backspace als "rückgängig machen" agiert, wird die Taste als Texteingabetaste behandelt. Ob die Taste unterdrückt wird, ist insbesondere abhängig von VisibleText, nicht von VisibleNonText.

Backspace wird immer ignoriert, wenn die Taste zusammen mit einer Modifikatortaste wie Strg gedrückt wird (es wird nicht der physische, sondern der logische Modifikatorstatus geprüft).

Hinweis: Wenn der Eingabetext sichtbar ist (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, nicht das Zeichen nach der Einfügemarke.

CaseSensitive

Legt fest, ob Vergleichsliste Groß-/Kleinschreibung-sensitiv sein soll.

BoolescherWert := InputHook.CaseSensitive
InputHook.CaseSensitive := BoolescherWert

Typ: Integer (boolescher Wert). Standard: False. Die C-Option setzt den Wert auf True.

FindAnywhere

Legt fest, ob alle Übereinstimmungen ein Teil des Eingabetexts sein sollen.

BoolescherWert := InputHook.FindAnywhere
InputHook.FindAnywhere := BoolescherWert

Typ: Integer (boolescher Wert). Standard: False. Die *-Option setzt den Wert auf True.

Wenn diese Eigenschaft auf True gesetzt wird, kann eine Übereinstimmung überall innerhalb dessen gefunden werden, was der Benutzer eingibt (die Übereinstimmung kann eine Teilzeichenkette des Eingabetexts sein). Wenn diese Eigenschaft auf False gesetzt wird, muss alles, was der Benutzer eingibt, mit eines der Elemente in Vergleichsliste übereinstimmen. In beiden Fällen muss eines der Elemente in Vergleichsliste vollständig eingegeben werden.

MinSendLevel

Ermittelt oder setzt die minimale Sendestufe der zu erfassenden Eingabe.

Stufe := InputHook.MinSendLevel
InputHook.MinSendLevel := Stufe

Typ: Integer. Standard: 0. Die I-Option setzt den Wert auf 1 (oder den angegebenen Wert).

Stufe sollte ein Integer im Bereich von 0 bis 101 sein. Ereignisse, die eine Sendestufe kleiner als dieser Wert haben, werden ignoriert. Ein Wert von 101 bewirkt beispielsweise, dass alle via SendEvent erzeugten Eingaben ignoriert werden, während ein Wert von 1 nur Eingaben mit der Standardsendestufe (0) ignoriert.

SendInput und SendPlay werden immer ignoriert, egal ob diese Einstellung aktiv ist oder nicht. Eingaben, die von einer anderen Quelle stammen, können niemals über diese Einstellung ignoriert werden.

NotifyNonText

Legt fest, ob die Callbacks OnKeyDown und OnKeyUp jedes Mal aufgerufen werden sollen, wenn eine Nicht-Text-Taste gedrückt wird.

BoolescherWert := InputHook.NotifyNonText
InputHook.NotifyNonText := BoolescherWert

Typ: Integer (boolescher Wert). Standard: False.

Wenn diese Eigenschaft auf True gesetzt wird, werden Benachrichtigungen für alle Tastendrücke aktiviert, die keinen Text erzeugen, wie z. B. oder Alt+F. Das Setzen dieser Eigenschaft hat keinen Einfluss auf die Optionen einer Taste, da die Texterzeugung vom Tastaturlayout des aktiven Fensters zum Zeitpunkt des Tastendrucks abhängt.

Beim Anwenden von NotifyNonText auf Taste-Oben-Ereignisse wird geprüft, ob ein vorheriges Taste-Unten-Ereignis mit einem passenden VK-Code als Text oder Nicht-Text klassifiziert wurde. Wenn NotifyNonText zum Beispiel True ist, wird beim Drücken von Strg+A ein OnKeyDown und OnKeyUp jeweils für Strg und A aufgerufen, während beim Drücken von nur A kein OnKeyDown oder OnKeyUp aufgerufen wird, es sei denn, es wurde KeyOpt genutzt, um Benachrichtigungen für diese Taste zu aktivieren.

Informationen darüber, welche Tasten als Texterzeuger eingestuft werden, finden Sie unter VisibleText.

Timeout

Ermittelt oder setzt den Timeout-Wert in Sekunden.

Sekunden := InputHook.Timeout
InputHook.Timeout := Sekunden

Typ: Float. Standard: 0.0 (kein Timeout). Die T-Option setzt auch den Timeout-Wert.

Die Timeout-Periode beginnt normalerweise mit dem Aufruf von Start. Wenn aber diese Eigenschaft ein Wert zugewiesen bekommt, während die Eingabeerfassung im Gange ist, wird die Timeout-Periode neu gestartet. Wenn die Eingabeerfassung nach Ablauf der Timeout-Periode noch im Gange ist, wird diese beendet und EndReason auf das Wort Timeout gesetzt.

VisibleNonText

Legt fest, ob Tasten oder Tastenkombinationen, die keinen Text erzeugen, sichtbar sein (blockiert werden) sollen.

BoolescherWert := InputHook.VisibleNonText
InputHook.VisibleNonText := BoolescherWert

Typ: Integer (boolescher Wert). Standard: True. Die V-Option setzt den Wert auf True.

Wenn diese Eigenschaft auf True gesetzt wird, können Tasten und Tastenkombinationen, die keinen Text erzeugen, Hotkeys auslösen oder an das aktive Fenster weitergeleitet werden. Wenn diese Eigenschaft auf False gesetzt wird, werden diese blockiert.

Informationen darüber, welche Tasten als Texterzeuger eingestuft werden, finden Sie unter VisibleText.

VisibleText

Legt fest, ob Tasten oder Tastenkombinationen, die Text erzeugen, sichtbar sein (blockiert werden) sollen.

BoolescherWert := InputHook.VisibleText
InputHook.VisibleText := BoolescherWert

Typ: Integer (boolescher Wert). Standard: False. Die V-Option setzt den Wert auf True.

Wenn diese Eigenschaft auf True gesetzt wird, können Tasten und Tastenkombinationen, die Text erzeugen, Hotkeys auslösen oder an das aktive Fenster weitergeleitet werden. Wenn diese Eigenschaft auf False gesetzt wird, werden diese blockiert.

Alle Tastendrücke, die dazu führen, dass Text an den Eingabepuffer angehängt wird, werden als Texterzeuger eingestuft, auch wenn sie dies in anderen Anwendungen normalerweise nicht tun. Strg+A beispielsweise erzeugt Text, wenn die M-Option vorhanden ist, und Escape erzeugt das Steuerzeichen Chr(27).

Tote Tasten werden als Texterzeuger eingestuft, obwohl sie in der Regel keinen unmittelbaren Effekt haben. Das Drücken einer toten Taste kann auch dazu führen, dass die folgende Taste Text erzeugt (wenn auch nur das Zeichen der toten Taste).

Backspace wird nur als Texterzeuger eingestuft, wenn es als "rückgängig machen" fungiert.

Die Standardmodifikatortasten und CapsLock, NumLock und ScrollLock sind immer sichtbar (nicht blockiert).

EndReason

Die EndReason-Eigenschaft gibt eine der folgenden Zeichenketten zurück:

Stopped Die Stop-Methode wurde aufgerufen oder Start wurde bisher noch nicht aufgerufen.
Max Die Eingabeerfassung hat die maximal erlaubte Länge erreicht und stimmt mit keinem der Elemente in Vergleichsliste überein.
Timeout Die Eingabeerfassung hat die Zeit überschritten.
Match Die Eingabeerfassung stimmt mit einem der Elemente in Vergleichsliste überein. Die Match-Eigenschaft enthält das gefundene Element.
EndKey

Eine der Endtasten wurde gedrückt, um die Eingabeerfassung zu beenden. Die EndKey-Eigenschaft enthält den Namen oder das Zeichen (ohne geschweifte Klammern) der entsprechenden Endtaste.

Wenn die Eingabeerfassung im Gange ist, ist EndReason leer.

Bemerkungen

Die Start-Methode kann nur aufgerufen werden, wenn die Eingabeerfassung nicht im Gange ist.

InputHook ist so konzipiert, dass verschiedene Teile des Skripts die Eingabe mit geringem Konfliktpotenzial überwachen können. Es kann kontinuierlich laufen, um z. B. auf willkürliche Wörter oder andere Muster zu reagieren. Es kann auch zeitweise genutzt werden, um z. B. Benutzereingaben zu erfassen oder vorübergehend bestimmte (oder unbestimmte) Tasten zu überschreiben, ohne Hotkeys zu beeinträchtigen.

Tastatur-Hotkeys bleiben wirksam, während eine Eingabeerfassung im Gange ist, aber können nicht von Tasten ausgelöst werden, die von der Eingabeerfassung unterdrückt werden.

Tasten werden entweder unterdrückt (blockiert) oder nicht, abhängig von den folgenden Faktoren (in dieser Reihenfolge):

Der Tastatur-Hook wird benötigt, während eine Eingabeerfassung im Gange ist, wird aber automatisch deinstalliert, wenn er nach Beendigung der Eingabeerfassung nicht mehr benötigt wird. Der Tastatur-Hook (sofern installiert) bewirkt, dass das Skript vorübergehend persistent wird; das heißt, dass das Skript nur noch mit ExitApp beendet werden kann.

AutoHotkey unterstützt keine Input Method Editors (IME). Der Tastatur-Hook fängt Tastaturereignisse ab und wandelt sie mithilfe von ToUnicodeEx oder ToAsciiEx in Text um (außer im Falle von VK_PACKET-Ereignissen, die ein einzelnes Zeichen beinhalten).

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

Trotz ihrer geringeren Flexibilität sind Hotstrings in der Regel einfacher zu bedienen.

InputHook vs. Input

InputHook und der Input-Befehl sind zwei verschiedene Schnittstellen, die im Grunde die gleiche Funktionalität bieten. Die folgenden zwei Beispiele sind funktionsgemäß nahezu identisch:

Input, AusgabeVar, %Optionen%, %Endtasten%, %Vergleichsliste%
ih := InputHook(Optionen, Endtasten, Vergleichsliste)
ih.Start()
ErrorLevel := ih.Wait()
if (ErrorLevel = "EndKey")
    ErrorLevel .= ":" ih.EndKey
AusgabeVar := ih.Input

Der Input-Befehl beendet jede vorher von ihm gestartete Eingabeerfassung, während InputHook mehrere Eingabeerfassungen gleichzeitig erlaubt.

Optionen wird gleichermaßen interpretiert, allerdings gibt es Unterschiede bei den Standardeinstellungen:

Der Input-Befehl blockiert den Thread, während eine Eingabeerfassung im Gange ist, wohingegen InputHook dem Thread erlaubt, fortzufahren oder sogar beendet zu werden (wodurch jeder von ihm unterbrochene Thread fortgesetzt werden kann). Anstatt zu warten, kann das Skript eine OnEnd-Funktion registrieren, die aufgerufen wird, wenn die Eingabeerfassung beendet wird.

Der Input-Befehl gibt die Eingabe des Benutzers erst zurück, nachdem die Eingabeerfassung beendet wurde, während mit der Input-Eigenschaft von InputHook die aktuelle Eingabe des Benutzers jederzeit abgerufen werden kann. Anstatt ständig die Input-Eigenschaft zu prüfen, kann das Skript eine OnChar-Funktion registrieren, die jedes Mal aufgerufen wird, wenn ein Zeichen hinzugefügt wird.

InputHook ermöglicht deutlich mehr Kontrolle über einzelne Tasten via KeyOpt-Methode. Dazu gehört das Hinzufügen oder Entfernen von Endtasten, das Unterdrücken oder Nicht-Unterdrücken bestimmter Tasten oder das Ignorieren von Texterzeugnissen bestimmter Tasten.

Im Gegensatz zum Input-Befehl kann InputHook genutzt werden, um Tasten zu erkennen, die keinen Text erzeugen, ohne die Eingabeerfassung zu beenden. Hierzu wird eine OnKeyDown-Funktion registriert und KeyOpt oder NotifyNonText verwendet, um die zu betreffenden Tasten anzugeben.

Wenn eines der Elemente in Vergleichsliste die Eingabeerfassung beendet hat, kann die Match-Eigenschaft herangezogen werden, um genau zu bestimmen, welche Übereinstimmung eingetreten ist (vor allem dann, wenn die *-Option vorhanden ist).

Obwohl das Skript GetKeyState nach einem Input-Befehl heranziehen kann, spiegelt es manchmal nicht genau wider, welche Tasten gedrückt wurden, nachdem die Eingabeerfassung beendet wurde. Die EndMods-Eigenschaft von InputHook spiegelt den logischen Zustand der Modifikatortasten zum Zeitpunkt der Beendigung der Eingabeerfassung wider.

Es gibt einige Unterschiede in Bezug auf die Abwärtskompatibilität:

Siehe auch

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

Beispiele

#1: Wartet darauf, dass der Benutzer eine einzelne Taste drückt.

MsgBox % KeyWaitAny()

; Das Gleiche nochmal, aber ohne dass die Taste blockiert wird.
MsgBox % KeyWaitAny("V")

KeyWaitAny(Optionen:="")
{
    ih := InputHook(Optionen)
    ih.KeyOpt("{All}", "ES")  ; End und Suppress
    ih.Start()
    ErrorLevel := ih.Wait()  ; EndReason in ErrorLevel speichern
    return ih.EndKey  ; Tastenname zurückgeben
}

#2: Wartet auf eine Taste in Kombination mit Strg/Alt/Umschalt/Win.

MsgBox % KeyWaitCombo()

KeyWaitCombo(Optionen:="")
{
    ih := InputHook(Optionen)
    ih.KeyOpt("{All}", "ES")  ; End und Suppress
    ; Modifikatoren ausschließen
    ih.KeyOpt("{LCtrl}{RCtrl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{RWin}", "-ES")
    ih.Start()
    ErrorLevel := ih.Wait()  ; EndReason in ErrorLevel speichern
    return ih.EndMods . ih.EndKey  ; Eine Zeichenkette wie <^<+Esc zurückgeben
}

#3: Einfache Auto-Vervollständigung eines beliebigen Wochentages. Dies ist ein voll funktionsfähiges Beispiel. Starten Sie einfach das Skript und beginnen Sie, den Namen eines Tages zu schreiben. Drücken Sie Tab, um den Namen zu vervollständigen, oder drücken Sie Escape, um das Skript zu beenden.

global Wortliste := "Montag`nDienstag`nMittwoch`nDonnerstag`nFreitag`nSamstag`nSonntag"

global Suffix := "", SacHook

SacHook := InputHook("V", "{Esc}")
SacHook.OnChar := Func("SacChar")
SacHook.OnKeyDown := Func("SacKeyDown")
SacHook.OnEnd := Func("SacEnd")
SacHook.KeyOpt("{Backspace}", "N")
SacHook.Start()

SacChar(ih, char)  ; Wird aufgerufen, wenn ein Zeichen zu SacHook.Input hinzugefügt wird.
{
    Suffix := ""
    if RegExMatch(ih.Input, "`nm)\w+$", prefix)
        RegExMatch(Wortliste, "`nmi)^" prefix "\K.*", Suffix)
    
    ToolTip % Suffix, % A_CaretX + 15, % A_CaretY    
    
    ; Tab nur abfangen, während ein ToolTip angezeigt wird.
    ih.KeyOpt("{Tab}", Suffix = "" ? "-NS" : "+NS")
}

SacKeyDown(ih, vk, sc)
{
    if (vk = 8) ; Backspace
        SacChar(ih, "")
    else if (vk = 9) ; Tab
        Send % "{Text}" Suffix
}

SacEnd()
{
    ExitApp
}