Erstellt ein Objekt, mit dem Tastatureingaben gesammelt oder abgefangen werden können.
InputHook := InputHook(Optionen, EndTasten, VergleichListe)
Eine Zeichenkette, die aus beliebig vielen der folgenden Optionen besteht (in beliebiger Reihenfolge, optional durch Leerzeichen getrennt):
B: Setzt BackspaceIsUndo auf 0 (false), damit Backspace ignoriert wird.
C: Setzt CaseSensitive auf 1 (true), um VergleichListe Groß-Kleinschreibung-sensitiv zu machen.
I: Setzt MinSendLevel auf 1 oder den angegebenen Wert, um Eingaben mit einem Sendlevel kleiner als dieser Wert zu ignorieren. Zum Beispiel bewirkt I2
, dass Eingaben mit Level 0 (Standardwert) oder 1 ignoriert werden, aber Eingaben ab Level 2 erfasst werden.
L: Längenlimit (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 Schlüsselwörter in VergleichListe überein, dann wird EndReason auf das Wort Match gesetzt). Wenn diese Option nicht angegeben ist, gilt standardmäßig ein Längenlimit von 1023 Zeichen.
Die Angabe von L0
deaktiviert das Sammeln von Text und das Längenlimit, hat aber keinen Einfluss darauf, welche Tasten als Texterzeuger eingestuft werden (siehe VisibleText). Dies kann in Zusammenhang mit OnChar, OnKeyDown, KeyOpt oder dem EndTasten-Parameter 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). Durch die M-Option kann es passieren, dass sich einige Tastaturkurzbefehle, wie z.B. Strg+←, während einer aktiven Eingabeerfassung falsch verhalten.
T: Setzt Timeout (z.B. T3
oder T2.5
).
V: Setzt VisibleText und VisibleNonText auf 1 (true). Normalerweise wird die Eingabe des Benutzers blockiert (unsichtbar für das Betriebssystem gemacht). Verwenden Sie diese Option, damit die Tastendrücke des Benutzers direkt an das aktive Fenster gesendet werden.
*: Platzhalter. Setzt FindAnywhere auf 1 (true), damit überall Übereinstimmungen innerhalb dessen, was der Benutzer eingibt, gefunden werden können.
E: Einzelzeichen-Endungstasten werden als Zeichencode statt als Tastencode behandelt. Dies ermöglicht konsistentere Ergebnisse, wenn die Tastaturbelegung des aktiven Fensters von der des Skripts abweicht. Dies verhindert auch, dass Tastenkombinationen, die die angegebenen Endungszeichen nicht erzeugen, die Eingabeerfassung beenden; z.B. wird @ als Endungstaste in einer US-Belegung durch Umschalt+2 ausgelöst, aber nicht durch Strg+Umschalt+2 (wenn die E-Option verwendet wird). Wenn zusätzlich noch die C-Option angegeben ist, ist das Endungszeichen Groß-/Kleinschreibung-sensitiv.
Eine Liste beliebig vieler Tasten, von denen jede, wenn gedrückt, zur Beendigung der Eingabeerfassung führt (die Endungstaste selbst wird nicht in den Eingabepuffer geschrieben). Bei einer auf diese Weise beendeten Eingabeerfassung wird EndReason auf das Wort EndKey und EndKey auf den Namen der Taste gesetzt.
EndTasten verwendet ein ähnliches Format wie der Send-Befehl. Zum Beispiel würde die Angabe von {Enter}.{Esc}
bewirken, dass die Eingabeerfassung durch Enter, . oder Esc beendet wird. Um die geschweiften Klammern als Endungstasten zu verwenden, geben Sie {{}
und/oder {}}
an.
Um Strg, Alt oder Umschalt als Endungstasten zu verwenden, geben Sie die linke und/oder rechte Version der Taste an, nicht die neutrale Version. Zum Beispiel müssen Sie {LControl}{RControl}
anstelle von {Control}
angeben.
Obwohl modifizierte Tasten wie Alt+C (!c) nicht unterstützt werden, müssen für nicht-alphanumerische Zeichen wie z.B. ?!:@&{}
standardmäßig Umschalt oder AltGr gedrückt oder nicht gedrückt werden, je nachdem, wie das Zeichen normalerweise eingegeben wird. Wenn die E-Option vorhanden ist, werden die Namen von Einzelzeichentasten stattdessen als Zeichen interpretiert - in diesem Fall müssen die Modifikatortasten im richtigen Status sein, um dieses Zeichen zu erzeugen. Verwendet man sowohl die E-Option als auch die M-Option, werden die modifizierten Tasten von Strg+A bis Strg+Z durch Einfügen der entsprechenden ASCII-Steuerzeichen in EndTasten unterstützt.
Es kann auch explizit ein Tastencode wie {vkFF}
oder {sc001}
angegeben werden. Dies ist nützlich für den seltenen Fall, dass eine Taste keinen Namen hat und beim Drücken kein sichtbares Zeichen erzeugt. Schauen Sie sich die Anleitung am Ende der Tastenliste an, um zu erfahren, wie der virtuelle Tastencode einer solchen Taste ermittelt werden kann.
Eine kommagetrennte Liste von Schlüsselwörtern, von denen jedes zur Beendigung der Eingabeerfassung führt (in diesem Fall wird EndReason auf das Wort Match gesetzt). Alles, was der Benutzer eingibt, muss exakt mit einem der Schlüsselwörter in der Liste übereinstimmen, um eine Übereinstimmung zu bewirken (es sei denn, die *-Option wird verwendet). Alle Leer- und Tabulatorzeichen neben den Kommas sind relevant, d.h. sie sind Teil der Vergleichszeichenkette. Wenn VergleichListe z.B. ABC , XYZ
ist, muss der Benutzer ein Leerzeichen nach ABC oder vor XYZ eingeben, damit eine Übereinstimmung erfolgt.
Zwei aufeinanderfolgende Kommas ergeben ein direkt geschriebenes Komma. Zum Beispiel würde das Folgende ein direkt geschriebenes Komma nach dem Wort Zkette1 erzeugen: Zkette1,,,Zkette2
. Entsprechend enthält die folgende Liste nur ein einzelnes Element mit einem direkt geschriebenen Komma dazwischen: einzelnes,,Element
.
Da die Elemente in VergleichListe nicht als einzelne Parameter behandelt werden, kann die Liste komplett in einer Variable enthalten sein. Tatsächlich muss sie ganz oder teilweise in einer Variable enthalten sein, wenn ihre Länge 16383 Zeichen überschreitet, da dies die maximale Länge einer Skriptzeile ist. Zum Beispiel könnte VergleichListe aus %Liste1%,%Liste2%,%Liste3%
bestehen, wobei jede der Variablen eine lange Unterliste von Schlüsselwörtern enthält.
Es können beliebig viele InputHook-Objekte erstellt werden und gleichzeitig aktiv sein, allerdings hat die Reihenfolge, in der sie gestartet werden, Einfluss darauf, wie die Eingaben gesammelt werden.
Wenn eine Eingabeerfassung gestartet wird (via Start-Methode oder Input-Befehl), wird sie an die Spitze eines Stapels geschoben und erst von diesem Stapel entfernt, wenn die Eingabeerfassung beendet wird. Tastaturereignisse werden an jede Eingabeerfassung übergeben, der Reihe nach, von der jüngsten bis zur ältesten Eingabeerfassung im Stapel. Wenn eine Eingabeerfassung ein bestimmtes Tastaturereignis unterdrückt, wird es nicht an ältere Eingabeerfassungen im Stapel übergeben.
Gesendete Tastendrücke werden ignoriert, wenn der Sendlevel des Tastendrucks kleiner als InputHooks MinSendLevel ist. In diesem Fall kann der Tastendruck immer noch von einer älteren Eingabeerfassung im Stapel verarbeitet werden.
Es können mehrere InputHooks in Kombination mit MinSendLevel verwendet werden, um sowohl gesendete als auch reale Tastendrücke separat zu sammeln.
Der Aufruf des Input-Befehls beendet jede zuvor via Input-Befehl gestartete Eingabeerfassung, lässt aber alle InputHooks aktiv. Wenn die Eingabeerfassung nicht sichtbar ist, werden alle InputHooks, die von ihr unterbrochen werden, grundsätzlich keine Eingaben sammeln, bis der Input-Befehl beendet ist.
Die InputHook-Funktion gibt ein InputHook-Objekt mit den folgenden Methoden und Eigenschaften zurück.
Setzt Optionen für eine Taste oder eine Liste von Tasten.
InputHook.KeyOpt(Tasten, Tastenoptionen)
Eine Liste von Tasten. Mit geschweiften Klammern werden Tastennamen, virtuelle Tastencodes oder Scancodes umschlossen, ähnlich dem Send-Befehl. Zum Beispiel kann {Enter}.{{}
für Enter, . und { verwendet werden. Die Angabe einer Taste via Name, {vkNN}
oder {scNNN}
kann zu drei verschiedenen Ergebnissen führen; Einzelheiten finden Sie unten.
Geben Sie nur die Zeichenkette {All}
an (nicht Groß-/Kleinschreibung-sensitiv), um Tastenoptionen auf alle VKs und SCs anzuwenden. KeyOpt kann dann ein zweites Mal aufgerufen werden, um Optionen von bestimmten Tasten zu entfernen.
Eine oder mehrere der folgenden Einzelzeichenoptionen (Leer- und Tabulatorzeichen werden ignoriert).
- (minus): Entfernt alle Optionen nach dem -
, bis zum nächsten +
.
+ (plus): Bricht alle vorherigen -
ab, andernfalls ohne Wirkung.
E: Endungstaste. Wenn diese Option aktiviert ist, wird beim Drücken der Taste die Eingabeerfassung beendet, EndReason auf das Wort EndKey gesetzt und EndKey auf den normalisierten Namen der Taste gesetzt. Im Gegensatz zum EndTasten-Parameter wird der Status von Umschalt oder AltGr ignoriert. Zum Beispiel sind "
und 2
in der deutschen Tastaturbelegung ä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 normalerweise keinen Text erzeugt.
N: Benachrichtigen. Bewirkt, dass jedes Mal die OnKeyDown- und OnKeyUp-Rückruffunktionen 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) wird. Dies überschreibt VisibleText oder VisibleNonText, bis -V
verwendet wird. +V
beinhaltet -S
.
Optionen können sowohl via virtuellen Tastencode (VK) als auch Scancode (SC) gesetzt werden und sind kumulativ.
Wenn eine Taste via Name angegeben wurde, werden die Optionen entweder via VK oder SC gesetzt. Wenn zwei physische Tasten dieselbe VK, aber unterschiedliche SCs haben (z.B. 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 von der aktiven Tastaturbelegung abhängt).
Das Entfernen einer Option via VK-Nummer hat keinen Einfluss auf Optionen, die via SC gesetzt wurden, und 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äß der Tastaturbelegung 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.
Startet die Eingabeerfassung.
InputHook.Start()
Hat keine Wirkung, wenn die Eingabeerfassung bereits aktiv ist.
Die neue Eingabeerfassung wird an die Spitze des InputHook-Stapels platziert, so dass sie jede zuvor gestartete Eingabeerfassung überschreiben kann.
Diese Methode installiert den Tastatur-Hook (falls noch nicht geschehen).
Beendet die Eingabeerfassung und setzt EndReason auf das Wort Stopped.
InputHook.Stop()
Hat keine Wirkung, wenn die Eingabeerfassung nicht aktiv ist.
Wartet auf die Beendigung der Eingabeerfassung, also wenn InProgress False ist.
EndReason := InputHook.Wait(MaxZeit)
Wenn weggelassen, wird unendlich lang gewartet. Andernfalls geben Sie die maximale Wartezeit in Sekunden an. Wenn die Eingabeerfassung nach MaxZeit Sekunden immer noch aktiv ist, wird die Methode aufhören zu warten und die Eingabeerfassung nicht beenden.
Diese Methode gibt EndReason zurück.
Gibt den Namen der Endungstaste zurück, die gedrückt wurde, um die Eingabeerfassung zu beenden.
TasteName := InputHook.EndKey
Beachten Sie, dass EndKey immer den "normalisierten" Namen der Taste zurückgibt, unabhängig von der Schreibweise im EndTasten-Parameter. Zum Beispiel bewirkt sowohl {Esc}
als auch {vk1B}
, dass Escape
erzeugt wird. Mit GetKeyName() kann der normalisierte Name abgerufen werden.
Wenn die E-Option verwendet wurde, gibt EndKey das tatsächlich eingegebene Zeichen zurück (sofern vorhanden). Andernfalls wird der Tastenname gemäß der aktiven Tastaturbelegung des Skripts ermittelt.
EndKey gibt eine leere Zeichenkette zurück, wenn EndReason nicht "EndKey" ist.
Gibt eine Zeichenkette von Modifikatoren zurück, die logisch unten waren, als die Eingabeerfassung beendet wurde.
Mods := InputHook.EndMods
Wenn alle Modifikatoren logisch unten (gedrückt) waren, ist die komplette Zeichenkette:
<^>^<!>!<+>+<#>#
Diese Modifikatoren haben dieselbe Bedeutung wie die der Hotkeys. Jeder Modifikator ist immer mit < (links) oder > (rechts) gekennzeichnet. Die entsprechenden Tastennamen sind: LCtrl, RCtrl, LAlt, RAlt, LShift, RShift, LWin, RWin.
Mit InStr() kann geprüft werden, ob ein bestimmter Modifikator (z.B. >!
oder ^
) vorhanden ist. Die folgende Zeile kann verwendet werden, um Mods in eine Zeichenkette von neutralen Modifikatoren wie z.B. ^!+#
umzuwandeln:
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 in der OnEnd-Rückruffunktion verwendet wird.
Gibt eine EndReason-Zeichenkette zurück, die angibt, wie die Eingabeerfassung beendet wurde.
Grund := InputHook.EndReason
Wenn die Eingabeerfassung noch aktiv ist, wird eine leere Zeichenkette zurückgegeben.
Gibt 1 (true) zurück, wenn die Eingabeerfassung aktiv ist, andernfalls 0 (false).
Boolesch := InputHook.InProgress
Gibt den Text zurück, der seit dem letzten Start der Eingabeerfassung gesammelt wurde.
Zkette := InputHook.Input
Diese Eigenschaft kann verwendet werden, während die Eingabeerfassung aktiv ist oder nachdem sie beendet wurde.
Gibt eines der Schlüsselwörter in VergleichListe zurück, das zur Beendigung der Eingabeerfassung geführt hat.
Zkette := InputHook.Match
Diese Eigenschaft gibt das gefundene Schlüsselwort mit originaler Groß-/Kleinschreibung zurück, die von dem abweichen kann, was der Benutzer eingegeben hat, wenn die C-Option weggelassen wurde, oder eine leere Zeichenkette, wenn EndReason nicht "Match" ist.
Ermittelt oder setzt das Funktionsobjekt, das bei Beendigung der Eingabeerfassung aufgerufen wird.
AktuelleFunk := InputHook.OnEnd
InputHook.OnEnd := NeueFunk
AktuelleFunk ist NeueFunk, falls zugewiesen, andernfalls eine leere Zeichenkette.
NeueFunk ist ein Funktionsobjekt, das aufgerufen werden soll, z.B. Func("MeinRückruf")
. Eine leere Zeichenkette bedeutet kein Funktionsobjekt.
Die Rückruffunktion akzeptiert einen Parameter und kann wie folgt definiert werden:
MeinRückruf(InputHook) { ...
Es spielt keine Rolle, welchen Namen Sie dem Parameter geben, allerdings wird ihm als Wert die Referenz zum InputHook-Objekt zugewiesen.
Der Parameter der Rückruffunktion kann weggelassen werden, wenn die entsprechende Information nicht benötigt wird.
Die Funktion wird als neuer Thread aufgerufen und verwendet daher vorerst die Standardwerte von Einstellungen wie SendMode und DetectHiddenWindows.
Ermittelt oder setzt das Funktionsobjekt, das nach dem Hinzufügen eines Zeichens zum Eingabepuffer aufgerufen wird.
AktuelleFunk := InputHook.OnChar
InputHook.OnChar := NeueFunk
AktuelleFunk ist NeueFunk, falls zugewiesen, andernfalls eine leere Zeichenkette.
NeueFunk ist ein Funktionsobjekt, das aufgerufen werden soll, z.B. Func("MeinRückruf")
. Eine leere Zeichenkette bedeutet kein Funktionsobjekt.
Die Rückruffunktion akzeptiert zwei Parameter und kann wie folgt definiert werden:
MeinRückruf(InputHook, Zeichen) { ...
Es spielt keine Rolle, welche Namen Sie den Parametern geben, allerdings werden ihnen die folgenden Werte nacheinander zugewiesen:
Es können beliebig viele Parameter am Ende der Parameterliste der Rückruffunktion weggelassen werden, wenn die entsprechenden Informationen nicht benötigt werden.
Mehrere Zeichen bedeuten, dass vor dem letzten Tastendruck eine tote Taste gedrückt wurde, die beiden Tasten aber nicht in ein einziges Zeichen transliteriert (umgewandelt) werden konnten. Zum Beispiel erzeugt `e und `z bei manchen Tastaturbelegungen è
und `z
.
Die Funktion wird nie aufgerufen, wenn eine Endungstaste gedrückt wird.
Ermittelt oder setzt das Funktionsobjekt, das beim Drücken einer benachrichtigungsfähigen Taste aufgerufen wird.
AktuelleFunk := InputHook.OnKeyDown
InputHook.OnKeyDown := NeueFunk
Taste-Unten-Benachrichtigungen müssen zuerst via KeyOpt oder NotifyNonText aktiviert werden.
AktuelleFunk ist NeueFunk, falls zugewiesen, andernfalls eine leere Zeichenkette.
NeueFunk ist ein Funktionsobjekt, das aufgerufen werden soll, z.B. Func("MeinRückruf")
. Eine leere Zeichenkette bedeutet kein Funktionsobjekt.
Die Rückruffunktion akzeptiert drei Parameter und kann wie folgt definiert werden:
MeinRückruf(InputHook, VK, SC) { ...
Es spielt keine Rolle, welche Namen Sie den Parametern geben, allerdings werden ihnen die folgenden Werte nacheinander zugewiesen:
Es können beliebig viele Parameter am Ende der Parameterliste der Rückruffunktion weggelassen werden, wenn die entsprechenden Informationen nicht benötigt werden.
Um den Tastennamen abzurufen (falls vorhanden), verwenden Sie GetKeyName(Format("vk{:x}sc{:x}", VK, SC))
.
Die Funktion wird als neuer Thread aufgerufen und verwendet daher vorerst die Standardwerte von Einstellungen wie SendMode und DetectHiddenWindows.
Die Funktion wird nie aufgerufen, wenn eine Endungstaste gedrückt wird.
Ermittelt oder setzt das Funktionsobjekt, das beim Loslassen einer benachrichtigungsfähigen Taste aufgerufen wird.
AktuelleFunk := InputHook.OnKeyUp
InputHook.OnKeyUp := NeueFunk
Taste-Oben-Benachrichtigungen müssen zuerst via KeyOpt oder NotifyNonText aktiviert werden. Ob eine Taste als Text oder Nicht-Text behandelt wird, 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 behandelt.
AktuelleFunk ist NeueFunk, falls zugewiesen, andernfalls eine leere Zeichenkette.
NeueFunk ist ein Funktionsobjekt, das aufgerufen werden soll, z.B. Func("MeinRückruf")
. Eine leere Zeichenkette bedeutet kein Funktionsobjekt.
Die Rückruffunktion akzeptiert drei Parameter und kann wie folgt definiert werden:
MeinRückruf(InputHook, VK, SC) { ...
Es spielt keine Rolle, welche Namen Sie den Parametern geben, allerdings werden ihnen die folgenden Werte nacheinander zugewiesen:
Es können beliebig viele Parameter am Ende der Parameterliste der Rückruffunktion weggelassen werden, wenn die entsprechenden Informationen nicht benötigt werden.
Um den Tastennamen abzurufen (falls vorhanden), verwenden Sie GetKeyName(Format("vk{:x}sc{:x}", VK, SC))
.
Die Funktion wird als neuer Thread aufgerufen und verwendet daher vorerst die Standardwerte von Einstellungen wie SendMode und DetectHiddenWindows.
Bestimmt, ob Backspace das zuletzt gedrückte Zeichen vom Ende des Eingabepuffers entfernt.
AktuelleEinstellung := InputHook.BackspaceIsUndo
InputHook.BackspaceIsUndo := NeueEinstellung
AktuelleEinstellung ist NeueEinstellung, falls zugewiesen, andernfalls standardmäßig 1 (true), es sei denn, es wurde mit der B-Option überschrieben.
NeueEinstellung ist ein boolescher Wert, der diese Einstellung aktiviert oder deaktiviert.
Wenn Backspace als "rückgängig machen" agiert, wird die Taste als Texteingabetaste behandelt. Ob die Taste unterdrückt wird, hängt insbesondere von VisibleText ab, nicht von VisibleNonText.
Backspace wird immer ignoriert, wenn die Taste in Kombination mit einer Modifikatortaste wie Strg gedrückt wird (es wird der logische Modifikatorstatus geprüft, nicht der physische).
Hinweis: Wenn der Eingabetext sichtbar ist (z.B. in einem Texteditor) und die Pfeiltasten oder andere Mittel zur Navigation innerhalb des Textes verwendet werden, entfernt Backspace weiterhin das letzte Zeichen, nicht das Zeichen nach dem Textcursor (Einfügemarke).
Bestimmt, ob VergleichListe Groß-/Kleinschreibung-sensitiv ist.
AktuelleEinstellung := InputHook.CaseSensitive
InputHook.CaseSensitive := NeueEinstellung
AktuelleEinstellung ist NeueEinstellung, falls zugewiesen, andernfalls standardmäßig 0 (false), es sei denn, es wurde mit der C-Option überschrieben.
NeueEinstellung ist ein boolescher Wert, der diese Einstellung aktiviert oder deaktiviert.
Bestimmt, ob jede Übereinstimmung eine Teilzeichenkette des Eingabetextes sein kann.
AktuelleEinstellung := InputHook.FindAnywhere
InputHook.FindAnywhere := NeueEinstellung
AktuelleEinstellung ist NeueEinstellung, falls zugewiesen, andernfalls standardmäßig 0 (false), es sei denn, es wurde mit der *-Option überschrieben.
NeueEinstellung ist ein boolescher Wert, der diese Einstellung aktiviert oder deaktiviert. Wenn dies True ist, kann eine Übereinstimmung überall innerhalb dessen, was der Benutzer eingibt, gefunden werden (die Übereinstimmung kann eine Teilzeichenkette des Eingabetextes sein). Wenn dies False ist, muss alles, was der Benutzer eingibt, mit einem der Schlüsselwörter in VergleichListe übereinstimmen. In beiden Fällen muss eines der Schlüsselwörter in VergleichListe vollständig eingegeben werden.
Ermittelt oder setzt den minimalen Sendlevel der zu sammelnden Eingabe.
AktuellerLevel := InputHook.MinSendLevel
InputHook.MinSendLevel := NeuerLevel
AktuellerLevel ist NeuerLevel, falls zugewiesen, andernfalls standardmäßig 0, es sei denn, es wurde mit der I-Option überschrieben.
NeuerLevel muss ein Integer im Bereich von 0 bis 101 sein. Ereignisse mit einem Sendlevel kleiner als dieser Wert werden ignoriert. Zum Beispiel bewirkt ein Wert von 101, dass alle via SendEvent erzeugten Eingaben ignoriert werden, während ein Wert von 1 nur Eingaben mit dem Standardsendlevel (0) ignoriert.
SendInput und SendPlay werden immer ignoriert, egal ob diese Einstellung aktiv ist oder nicht. Eingaben, die von einer anderen Quelle als AutoHotkey stammen, können niemals über diese Einstellung ignoriert werden.
Bestimmt, ob die OnKeyDown- und OnKeyUp-Rückruffunktionen jedes Mal aufgerufen werden, wenn eine Nicht-Text-Taste gedrückt wird.
AktuelleEinstellung := InputHook.NotifyNonText
InputHook.NotifyNonText := NeueEinstellung
AktuelleEinstellung ist NeueEinstellung, falls zugewiesen, andernfalls standardmäßig 0 (false).
NeueEinstellung ist ein boolescher Wert, der diese Einstellung aktiviert oder deaktiviert. Wenn dies True ist, 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 von der Tastaturbelegung 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 True ist, bewirkt z.B. das Drücken von Strg+A, dass OnKeyDown und OnKeyUp sowohl für Strg als auch für A aufgerufen werden, während das Drücken von nur A bewirkt, dass weder OnKeyDown noch OnKeyUp aufgerufen wird, es sei denn, KeyOpt wurde verwendet, um Benachrichtigungen für diese Taste zu aktivieren.
Informationen darüber, welche Tasten als Texterzeuger eingestuft werden, finden Sie unter VisibleText.
Ermittelt oder setzt den Timeout-Wert in Sekunden.
AktuelleSekunden := InputHook.Timeout
InputHook.Timeout := NeueSekunden
AktuelleSekunden ist NeueSekunden, falls zugewiesen, andernfalls standardmäßig 0, es sei denn, es wurde mit der T-Option überschrieben.
NeueSekunden ist eine Floating-Point-Zahl, die das Zeitlimit repräsentiert. 0 bedeutet kein Zeitlimit.
Die Timeout-Periode startet normalerweise mit dem Aufruf von Start, wird aber neu gestartet, wenn dieser Eigenschaft ein Wert zugewiesen wird, während die Eingabeerfassung aktiv ist. Wenn die Eingabeerfassung nach Ablauf der Timeout-Periode immer noch aktiv ist, wird die Eingabeerfassung beendet und EndReason auf das Wort Timeout gesetzt.
Bestimmt, ob Tasten oder Tastenkombinationen, die keinen Text erzeugen, sichtbar sind (nicht blockiert werden).
AktuelleEinstellung := InputHook.VisibleNonText
InputHook.VisibleNonText := NeueEinstellung
AktuelleEinstellung ist NeueEinstellung, falls zugewiesen, andernfalls standardmäßig 1 (true). Die V-Option setzt dies auf 1 (true).
NeueEinstellung ist ein boolescher Wert, der diese Einstellung aktiviert oder deaktiviert. Wenn dies True ist, können Tasten und Tastenkombinationen, die keinen Text erzeugen, Hotkeys auslösen oder an das aktive Fenster übergeben werden. Wenn dies False ist, werden diese blockiert.
Informationen darüber, welche Tasten als Texterzeuger eingestuft werden, finden Sie unter VisibleText.
Bestimmt, ob Tasten oder Tastenkombinationen, die Text erzeugen, sichtbar sind (nicht blockiert werden).
AktuelleEinstellung := InputHook.VisibleText
InputHook.VisibleText := NeueEinstellung
AktuelleEinstellung ist NeueEinstellung, falls zugewiesen, andernfalls standardmäßig 0 (false), es sei denn, es wurde mit der V-Option überschrieben.
NeueEinstellung ist ein boolescher Wert, der diese Einstellung aktiviert oder deaktiviert. Wenn dies True ist, können Tasten und Tastenkombinationen, die Text erzeugen, Hotkeys auslösen oder an das aktive Fenster übergeben werden. Wenn dies False ist, werden diese blockiert.
Alle Tastendrücke, die Text an den Eingabepuffer anhängen, werden als Texterzeuger eingestuft, auch wenn sie das in anderen Anwendungen vielleicht nicht tun. Zum Beispiel würde Strg+A Text erzeugen, wenn die M-Option verwendet wird, und Esc das Steuerzeichen Chr(27)
erzeugen.
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 darauffolgende 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 regulären Modifikatortasten sowie Feststell, Num und Rollen sind immer sichtbar (nicht blockiert).
Die EndReason-Eigenschaft gibt eine der folgenden Zeichenketten zurück:
Zkette | Beschreibung |
---|---|
Stopped | Die Stop-Methode wurde aufgerufen oder die Start-Methode wurde bisher noch nicht aufgerufen. |
Max | Die Eingabeerfassung hat die maximal erlaubte Länge erreicht und stimmt mit keinem der Schlüsselwörter in VergleichListe überein. |
Timeout | Die Eingabeerfassung hat das Zeitlimit überschritten. |
Match | Die Eingabeerfassung stimmt mit einem der Schlüsselwörter in VergleichListe überein. Die Match-Eigenschaft enthält das gefundene Schlüsselwort. |
EndKey |
Eine der Endungstasten in EndTasten wurde gedrückt, um die Eingabeerfassung zu beenden. Die EndKey-Eigenschaft enthält den Namen oder das Zeichen (ohne geschweifte Klammern) der verantwortlichen Endungstaste. |
Wenn die Eingabeerfassung aktiv ist, ist EndReason leer. |
Die Start-Methode kann nur aufgerufen werden, wenn die Eingabeerfassung nicht aktiv 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 beliebige Wörter oder andere Muster zu reagieren. Es kann auch temporär laufen, um z.B. Benutzereingaben zu sammeln oder bestimmte (oder unbestimmte) Tasten vorübergehend zu überschreiben, ohne Hotkeys zu beeinträchtigen.
Tastatur-Hotkeys funktionieren auch während einer aktiven Eingabeerfassung, können aber 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. Zum Beispiel könnte der Hotkey ^+a::
durch InputHook überschrieben werden, während der Hotkey $^+a::
Vorrang hätte, es sei denn, InputHook hat Strg oder Umschalt unterdrückt.
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 aktiv ist, wird aber automatisch deinstalliert, wenn er nach Beendigung der Eingabeerfassung nicht mehr benötigt wird. Der Tastatur-Hook (falls installiert) macht das Skript temporär persistent; das heißt, dass zum Beenden des Skripts möglicherweise ExitApp anstelle von Exit erforderlich ist.
AutoHotkey unterstützt keine Input Method Editors (IME). Der Tastatur-Hook fängt Tastaturereignisse ab und übersetzt sie mittels ToUnicodeEx oder ToAsciiEx in Text (außer im Falle von VK_PACKET-Ereignissen, die ein einzelnes Zeichen kapseln).
Bei mehreren Sprachen oder Tastaturbelegungen verwendet InputHook die Tastaturbelegung des aktiven Fensters, nicht die des Skripts (egal ob die Eingabeerfassung sichtbar ist oder nicht).
Trotz ihrer geringeren Flexibilität sind Hotstrings in der Regel einfacher zu verwenden.
InputHook und der Input-Befehl sind zwei verschiedene Schnittstellen für dieselbe Grundfunktionalität. Die Folgenden sind funktional nahezu identisch:
Input, AusgabeVar, %Optionen%, %EndTasten%, %VergleichListe%
ih := InputHook(Optionen, EndTasten, VergleichListe) 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 gleich interpretiert, allerdings gibt es Unterschiede bei den Standardeinstellungen:
Der Input-Befehl blockiert den Thread, während er aktiv ist, während 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 bei Beendigung der Eingabeerfassung aufgerufen wird.
Der Input-Befehl gibt die Eingabe des Benutzers erst zurück, nachdem die Eingabeerfassung beendet wurde, während mit InputHooks Input-Eigenschaft 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 Endungstasten, das Unterdrücken oder Nicht-Unterdrücken bestimmter Tasten oder das Ignorieren von Texterzeugnissen bestimmter Tasten.
Im Gegensatz zum Input-Befehl kann InputHook verwendet werden, um Tasten, die keinen Text erzeugen, zu erkennen, ohne die Eingabeerfassung zu beenden. Registrieren Sie einfach eine OnKeyDown-Funktion und verwenden Sie KeyOpt oder NotifyNonText, um anzugeben, welche Tasten von Interesse sind.
Wenn eines der Schlüsselwörter in VergleichListe zur Beendigung der Eingabeerfassung geführt hat, kann die Match-Eigenschaft verwendet werden, um das verantwortliche Schlüsselwort zu ermitteln (dies ist nützlicher, wenn die *-Option vorhanden ist).
Obwohl das Skript GetKeyState nach dem Input-Befehl verwenden kann, gibt es manchmal nicht genau wieder, welche Tasten gedrückt wurden, nachdem die Eingabeerfassung beendet wurde. InputHooks EndMods-Eigenschaft gibt den logischen Status der Modifikatortasten zum Zeitpunkt der Beendigung der Eingabeerfassung wieder.
Es gibt einige Unterschiede hinsichtlich der Abwärtskompatibilität:
Wenn ein Tastenname in EndTasten einem VK entspricht, der von zwei physischen Tasten verwendet wird (z.B. NumpadUp und Up), behandelt der Input-Befehl die primäre Taste via VK und die sekundäre Taste via SC, während InputHook beide via SC behandelt. Mit der Schreibweise {vkNN}
kann die Taste via VK behandelt werden.
Wenn die Endungstaste via VK behandelt wird, können beide physischen Tasten die Eingabeerfassung beenden. Zum Beispiel bewirkt {NumpadUp}
, dass der Input-Befehl mit Up beendet werden kann, allerdings würde ErrorLevel EndKey:NumpadUp
enthalten, da nur der VK berücksichtigt wird.
Wenn eine Endungstaste via SC behandelt wird, erzeugt der Input-Befehl immer Namen für den bekannten sekundären SC eines bestimmten VK, und immer scNNN
für alle anderen Tasten (selbst wenn sie einen Namen haben). InputHook hingegen erzeugt einen Namen, wenn die Taste einen hat.
Input, KeyWait, Hotstrings, InputBox, #InstallKeybdHook, Threads, If Var [not] in/contains VergleichListe
Wartet, bis der Benutzer eine beliebige Taste drückt.
MsgBox % KeyWaitAny() ; Dasselbe nochmal, aber ohne Blockieren der Taste. MsgBox % KeyWaitAny("V") KeyWaitAny(Optionen:="") { ih := InputHook(Optionen) if !InStr(Optionen, "V") ih.VisibleNonText := false ih.KeyOpt("{All}", "E") ; End ih.Start() ErrorLevel := ih.Wait() ; EndReason in ErrorLevel speichern return ih.EndKey ; Tastenname zurückgeben }
Wartet auf eine beliebige Taste in Kombination mit Strg/Alt/Umschalt/Win.
MsgBox % KeyWaitCombo() KeyWaitCombo(Optionen:="") { ih := InputHook(Optionen) if !InStr(Optionen, "V") ih.VisibleNonText := false ih.KeyOpt("{All}", "E") ; End ; Modifikatoren ausschließen ih.KeyOpt("{LCtrl}{RCtrl}{LAlt}{RAlt}{LShift}{RShift}{LWin}{RWin}", "-E") ih.Start() ErrorLevel := ih.Wait() ; EndReason in ErrorLevel speichern return ih.EndMods . ih.EndKey ; Eine Zeichenkette wie <^<+Esc zurückgeben }
Einfache Autovervollstä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 Esc, um das Skript zu beenden.
global WörterListe := "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+$", Präfix) RegExMatch(WörterListe, "`nmi)^" Präfix "\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 }