InputHook

Erstellt ein Objekt, mit dem Tastatureingaben gesammelt oder abgefangen werden können.

InputHookObj := InputHook(Optionen, EndTasten, VergleichListe)

Parameter

Optionen

Typ: Zeichenkette

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: Erlaubt die Erzeugung von Text durch eine größere Anzahl von modifizierten Tastendrücken. Normalerweise wird eine Taste als Nicht-Text behandelt, wenn sie durch eine Kombination modifiziert wird, die nicht Umschalt, Strg+Alt (d.h. AltGr) oder Strg+Alt+Umschalt (d.h. AltGr+Umschalt) beinhaltet. Diese Option bewirkt, dass auch für andere Modifikatorkombinationen eine Übersetzung versucht wird. Das folgende Beispiel zeigt, wie Strg+C üblicherweise erkannt wird:

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

Standardmäßig ordnet das System Strg+A bis Strg+Z den ASCII-Steuerzeichen Chr(1) bis Chr(26) zu. Andere Übersetzungen können systembedingt oder durch die Tastaturbelegung des aktiven Fensters vorgegeben sein. Die Übersetzung kann Modifikatortasten ignorieren, für die die Tastaturbelegung keine Modifikatorbitmaske vorgibt. Zum Beispiel wird Win+E in der Regel zu "e" transkribiert, wenn die Option M verwendet wird.

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.

EndTasten

Typ: Zeichenkette

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 die Send-Funktion. 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.

VergleichListe

Typ: Zeichenkette

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. Zum Beispiel könnte VergleichListe aus Liste1 "," Liste2 "," Liste3 bestehen, wobei jede der Variablen eine lange Unterliste von Schlüsselwörtern enthält.

Input-Stapel

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

InputHook-Objekt

Die InputHook-Funktion gibt ein InputHook-Objekt mit den folgenden Methoden und Eigenschaften zurück.

"InputHookObj" wird hier stellvertretend für ein beliebiges InputHook-Objekt verwendet, da "InputHook" die Klasse selbst ist.

Methoden

KeyOpt

Setzt Optionen für eine Taste oder eine Liste von Tasten.

InputHookObj.KeyOpt(Tasten, Tastenoptionen)

Parameter

Tasten

Typ: Zeichenkette

Eine Liste von Tasten. Mit geschweiften Klammern werden Tastennamen, virtuelle Tastencodes oder Scancodes umschlossen, ähnlich der Send-Funktion. 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, einschließlich {vkE7} und {sc000}, wie unten beschrieben. KeyOpt kann dann ein zweites Mal aufgerufen werden, um Optionen von bestimmten Tasten zu entfernen.

Geben Sie {sc000} an, um Tastenoptionen auf alle Ereignisse ohne Scancode anzuwenden.

Geben Sie {vkE7} an, um Tastenoptionen auf Unicode-Ereignisse anzuwenden, wie z.B. die von SendEvent "{U+221e}" oder SendEvent "{Text}∞" gesendeten.

Tastenoptionen

Typ: Zeichenkette

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.

Bemerkungen

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 Optionen entweder via VK oder SC hinzugefügt. 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.

Um zu verhindern, dass eine Option Einfluss auf eine Taste hat, muss die Option sowohl vom VK als auch vom SC dieser Taste entfernt werden, oder von sc000, wenn die Taste keinen SC hat.

Unicode-Ereignisse, wie die von SendEvent "{U+221e}" oder SendEvent "{Text}∞" gesendeten, werden von Optionen beeinflusst, die entweder für vkE7 oder sc000 gesetzt wurden. Jede Option, die auf {All} angewendet wird, gilt sowohl für vkE7 als auch für sc000; um also Unicode-Ereignisse auszuschließen, muss die Option von beiden entfernt werden. Zum Beispiel:

InputHookObj.KeyOpt("{All}", "+I")  ; Text aller Ereignisse ignorieren
InputHookObj.KeyOpt("{vkE7}{sc000}", "-I")  ; außer Unicode-Ereignisse.

Start

Startet die Eingabeerfassung.

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

Stop

Beendet die Eingabeerfassung und setzt EndReason auf das Wort Stopped.

InputHookObj.Stop()

Hat keine Wirkung, wenn die Eingabeerfassung nicht aktiv ist.

Wait

Wartet auf die Beendigung der Eingabeerfassung, also wenn InProgress False ist.

EndReason := InputHookObj.Wait(MaxZeit)

Parameter

MaxZeit

Typ: Float

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.

Rückgabewert

Typ: Zeichenkette

Diese Methode gibt EndReason zurück.

Allgemeine Eigenschaften

EndKey

Gibt den Namen der Endungstaste zurück, die gedrückt wurde, um die Eingabeerfassung zu beenden.

TasteName := InputHookObj.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.

EndMods

Gibt eine Zeichenkette von Modifikatoren zurück, die logisch unten waren, als die Eingabeerfassung beendet wurde.

Mods := InputHookObj.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.

EndReason

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

Grund := InputHookObj.EndReason

Wenn die Eingabeerfassung noch aktiv ist, wird eine leere Zeichenkette zurückgegeben.

InProgress

Gibt 1 (true) zurück, wenn die Eingabeerfassung aktiv ist, andernfalls 0 (false).

Boolesch := InputHookObj.InProgress

Input

Gibt den Text zurück, der seit dem letzten Start der Eingabeerfassung gesammelt wurde.

Zkette := InputHookObj.Input

Diese Eigenschaft kann verwendet werden, während die Eingabeerfassung aktiv ist oder nachdem sie beendet wurde.

Match

Gibt eines der Schlüsselwörter in VergleichListe zurück, das zur Beendigung der Eingabeerfassung geführt hat.

Zkette := InputHookObj.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.

OnEnd

Ermittelt oder setzt das Funktionsobjekt, das bei Beendigung der Eingabeerfassung aufgerufen wird.

MeinRückruf := InputHookObj.OnEnd
InputHookObj.OnEnd := MeinRückruf

MeinRückruf ist ein Funktionsobjekt, das aufgerufen werden soll. Eine leere Zeichenkette bedeutet kein Funktionsobjekt.

Die Rückruffunktion akzeptiert einen Parameter und kann wie folgt definiert werden:

MeinRückruf(InputHookObj) { ...

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, aber dann muss ein Sternchen angegeben werden, z.B. MeinRückruf(*).

Die Funktion wird als neuer Thread aufgerufen und verwendet daher vorerst die Standardwerte von Einstellungen wie SendMode und DetectHiddenWindows.

OnChar

Ermittelt oder setzt das Funktionsobjekt, das nach dem Hinzufügen eines Zeichens zum Eingabepuffer aufgerufen wird.

MeinRückruf := InputHookObj.OnChar
InputHookObj.OnChar := MeinRückruf

MeinRückruf ist ein Funktionsobjekt, das aufgerufen werden soll. Eine leere Zeichenkette bedeutet kein Funktionsobjekt.

Die Rückruffunktion akzeptiert zwei Parameter und kann wie folgt definiert werden:

MeinRückruf(InputHookObj, Zeichen) { ...

Es spielt keine Rolle, welche Namen Sie den Parametern geben, allerdings werden ihnen die folgenden Werte nacheinander zugewiesen:

  1. Eine Referenz zum InputHook-Objekt.
  2. Eine Zeichenkette, die das Zeichen enthält (oder mehrere Zeichen, siehe unten für Details).

Es können beliebig viele Parameter am Ende der Parameterliste der Rückruffunktion weggelassen werden, wenn die entsprechenden Informationen nicht benötigt werden, aber dann muss als letzter Parameter ein Sternchen angegeben werden, z.B. MeinRückruf(Param1, *).

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.

OnKeyDown

Ermittelt oder setzt das Funktionsobjekt, das beim Drücken einer benachrichtigungsfähigen Taste aufgerufen wird.

MeinRückruf := InputHookObj.OnKeyDown
InputHookObj.OnKeyDown := MeinRückruf

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

MeinRückruf ist ein Funktionsobjekt, das aufgerufen werden soll. Eine leere Zeichenkette bedeutet kein Funktionsobjekt.

Die Rückruffunktion akzeptiert drei Parameter und kann wie folgt definiert werden:

MeinRückruf(InputHookObj, VK, SC) { ...

Es spielt keine Rolle, welche Namen Sie den Parametern geben, allerdings werden ihnen die folgenden Werte nacheinander zugewiesen:

  1. Eine Referenz zum InputHook-Objekt.
  2. Ein Integer, der den virtuellen Tastencode der Taste repräsentiert.
  3. Ein Integer, der den Scancode der Taste repräsentiert.

Es können beliebig viele Parameter am Ende der Parameterliste der Rückruffunktion weggelassen werden, wenn die entsprechenden Informationen nicht benötigt werden, aber dann muss als letzter Parameter ein Sternchen angegeben werden, z.B. MeinRückruf(Param1, *).

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.

OnKeyUp

Ermittelt oder setzt das Funktionsobjekt, das beim Loslassen einer benachrichtigungsfähigen Taste aufgerufen wird.

MeinRückruf := InputHookObj.OnKeyUp
InputHookObj.OnKeyUp := MeinRückruf

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.

MeinRückruf ist ein Funktionsobjekt, das aufgerufen werden soll. Eine leere Zeichenkette bedeutet kein Funktionsobjekt.

Die Rückruffunktion akzeptiert drei Parameter und kann wie folgt definiert werden:

MeinRückruf(InputHookObj, VK, SC) { ...

Es spielt keine Rolle, welche Namen Sie den Parametern geben, allerdings werden ihnen die folgenden Werte nacheinander zugewiesen:

  1. Eine Referenz zum InputHook-Objekt.
  2. Ein Integer, der den virtuellen Tastencode der Taste repräsentiert.
  3. Ein Integer, der den Scancode der Taste repräsentiert.

Es können beliebig viele Parameter am Ende der Parameterliste der Rückruffunktion weggelassen werden, wenn die entsprechenden Informationen nicht benötigt werden, aber dann muss als letzter Parameter ein Sternchen angegeben werden, z.B. MeinRückruf(Param1, *).

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.

Optionseigenschaften

BackspaceIsUndo

Bestimmt, ob Backspace das zuletzt gedrückte Zeichen vom Ende des Eingabepuffers entfernt.

AktuelleEinstellung := InputHookObj.BackspaceIsUndo
InputHookObj.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).

CaseSensitive

Bestimmt, ob VergleichListe Groß-/Kleinschreibung-sensitiv ist.

AktuelleEinstellung := InputHookObj.CaseSensitive
InputHookObj.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.

FindAnywhere

Bestimmt, ob jede Übereinstimmung eine Teilzeichenkette des Eingabetextes sein kann.

AktuelleEinstellung := InputHookObj.FindAnywhere
InputHookObj.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.

MinSendLevel

Ermittelt oder setzt den minimalen Sendlevel der zu sammelnden Eingabe.

AktuellerLevel := InputHookObj.MinSendLevel
InputHookObj.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.

NotifyNonText

Bestimmt, ob die OnKeyDown- und OnKeyUp-Rückruffunktionen jedes Mal aufgerufen werden, wenn eine Nicht-Text-Taste gedrückt wird.

AktuelleEinstellung := InputHookObj.NotifyNonText
InputHookObj.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.

Timeout

Ermittelt oder setzt den Timeout-Wert in Sekunden.

AktuelleSekunden := InputHookObj.Timeout
InputHookObj.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.

VisibleNonText

Bestimmt, ob Tasten oder Tastenkombinationen, die keinen Text erzeugen, sichtbar sind (nicht blockiert werden).

AktuelleEinstellung := InputHookObj.VisibleNonText
InputHookObj.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.

VisibleText

Bestimmt, ob Tasten oder Tastenkombinationen, die Text erzeugen, sichtbar sind (nicht blockiert werden).

AktuelleEinstellung := InputHookObj.VisibleText
InputHookObj.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).

EndReason

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.

Bemerkungen

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.

Das Skript ist automatisch persistent, während eine Eingabeerfassung aktiv ist, d.h. es erfasst Eingaben auch dann, wenn keine Threads laufen. Das Skript kann sich automatisch beenden, wenn die Eingabeerfassung endet (wenn keine Threads laufen und das Skript anderweitig nicht persistent 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 vs. Input (v1)

In AutoHotkey v1.1 kann InputHook anstelle des Input-Befehls verwendet werden, was mehr Flexibilität bietet. Der Input-Befehl wurde in v2.0 entfernt, aber der folgende Code ist weitgehend äquivalent:

; Input AusgabeVar, % Optionen, % EndTasten, % VergleichListe ; v1
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:

KeyWait, Hotstrings, InputBox, InstallKeybdHook, Threads

Beispiele

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()
    ih.Wait()
    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()
    ih.Wait()
    return ih.EndMods . ih.EndKey  ; Eine Zeichenkette wie <^<+Esc zurückgeben
}

Einfache Autovervollständigung eines beliebigen Wochentages. Abgesehen vom Wortspiel ist dies ein weitgehend funktionales 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.

WörterListe := "Montag`nDienstag`nMittwoch`nDonnerstag`nFreitag`nSamstag`nSonntag"

Suffix := ""

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

SacChar(ih, char)  ; Wird aufgerufen, wenn ein Zeichen zu SacHook.Input hinzugefügt wird.
{
    global Suffix := ""
    if RegExMatch(ih.Input, "`nm)\w+$", &Präfix)
        && RegExMatch(WörterListe, "`nmi)^" Präfix[0] "\K.*", &Suffix)
        Suffix := Suffix[0]
    
    if CaretGetPos(&cx, &cy)
        ToolTip Suffix, cx + 15, cy
    else
        ToolTip Suffix

    ; 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
}

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

ih := InputHook("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}")
ih.Start()
ih.Wait()

Dies ist ein funktionierendes Hotkey-Beispiel. Da der Hotkey das Tilde-Präfix (~) hat, wird sein eigener Tastendruck an das aktive Fenster weitergereicht. Wenn Sie also <btw (oder eines der anderen Schlüsselwörter) in einem Texteditor eingeben, wird das Skript automatisch eine Aktion Ihrer Wahl ausführen (z.B. den eingegebenen Text ersetzen). Eine alternative Version dieses Beispiels finden Sie unter Switch.

~<::
{
    msg := ""
    ih := InputHook("V T5 L4 C", "{enter}.{esc}{tab}", "btw,otoh,fl,ahk,ca")
    ih.Start()
    ih.Wait()
    if (ih.EndReason = "Max")
        msg := 'Ihre Eingabe "{1}" hat die maximale Textlänge erreicht.'
    else if (ih.EndReason = "Timeout")
        msg := 'Sie haben "{1}" innerhalb der verfügbaren Zeit eingegeben.'
    else if (ih.EndReason = "EndKey")
        msg := 'Sie haben "{1}" eingegeben und die Eingabeerfassung mit {2} beendet.'

    if msg  ; Wenn ein EndReason gefunden wurde, den Rest überspringen.
    {
        MsgBox Format(msg, ih.Input, ih.EndKey)
        return
    }

    ; Andernfalls wurde eine Übereinstimmung gefunden.
    if (ih.Input = "btw")
        Send("{backspace 4}by the way")
    else if (ih.Input = "otoh")
        Send("{backspace 5}on the other hand")
    else if (ih.Input = "fl")
        Send("{backspace 3}Florida")
    else if (ih.Input = "ca")
        Send("{backspace 3}California")
    else if (ih.Input = "ahk")
        Run("https://www.autohotkey.com")
}