SendMode [v1.0.43+]

Macht Send zum Synonym für SendInput oder SendPlay anstelle des Standards (SendEvent). Lässt auch Click, MouseClick, MouseClickDrag und MouseMove den angegebenen Modus verwenden.

SendMode, Modus

Parameter

Modus

Geben Sie eines der folgenden Wörter an, um den Sendemodus für nachfolgende Vorkommen von Send, SendRaw, Click, MouseClick, MouseClickDrag und MouseMove zu ändern:

Event: Standardmodus. Wechselt zum traditionellen SendEvent-Modus.

Input: Wechselt zum SendInput-Modus, der die schnellste und grundsätzlich zuverlässigste Methode zum Senden simulierter Tastendrücke und Mausklicks ist.

Play: Wechselt zum SendPlay-Modus, der schneller als SendEvent ist und möglicherweise dort funktioniert, wo andere Modi versagen, insbesondere in einigen Videospielen oder Anwendungen mit ungewöhnlicher Eingabeverarbeitung.

InputThenPlay [v1.0.43.02+]: Ähnlich wie Input, jedoch fällt es nicht auf Event zurück, wenn Input nicht verfügbar ist, sondern auf Play. Dies bewirkt auch, dass der SendInput-Befehl selbst in den Play zurückfällt, wenn Input nicht verfügbar ist.

Sendemodi

Die folgenden Abschnitte beschreiben die drei Methoden, mit denen AutoHotkey simulierte Tastendrücke und Mausklicks sendet: SendEvent, SendInput und SendPlay. Jeder Modus hat unterschiedliche Stärken und Schwächen, und Anwendungen können je nach Art der Eingabe unterschiedlich reagieren. Diese Unterschiede zu verstehen ist hilfreich, um den am besten geeigneten Modus für ein bestimmtes Skript oder die Zielanwendung zu finden.

SendEvent

SendEvent ist die traditionelle Methode zum Senden von Tastendrücken und Mausklicks. Allerdings ist SendEvent im Vergleich zu den anderen Sendemodi langsamer; es wird niemals die Geschwindigkeit von SendInput oder SendPlay erreichen.

SendEvent berücksichtigt die von SetKeyDelay und SetMouseDelay festgelegten Verzögerungen. Die Standardverzögerung ist 10 Millisekunden.

SendEvent wird auch automatisch verwendet, wenn SendInput nicht verfügbar ist, es sei denn, InputThenPlay ist aktiv.

Der SendEvent-Befehl kann verwendet werden, um Tastendrücke explizit via SendEvent-Modus zu senden.

SendInput

SendInput ist in der Regel die bevorzugte Methode zum Senden von Tastendrücken und Mausklicks, da sie schneller und zuverlässiger ist als die anderen Methoden. In den meisten Fällen ist SendInput nahezu verzögerungsfrei, sogar wenn lange Zeichenketten gesendet werden. Durch diese Schnelligkeit ist SendInput auch zuverlässiger, da das Risiko verringert wird, dass unerwartet ein anderes Fenster erscheint und die Tastendrücke abfängt. Die Zuverlässigkeit wird noch weiter verbessert durch die Tatsache, dass alles, was der Benutzer während eines SendInputs eingibt, bis zu dessen Abschluss nach hinten verschoben wird.

Im Gegensatz zu den anderen Sendemodi ist SendInput auf ca. 5000 Zeichen begrenzt (dies kann je nach Systemversion und Performanzeinstellungen variieren). Zeichen und Ereignisse oberhalb dieser Grenze werden nicht gesendet.

Hinweis: SendInput ignoriert SetKeyDelay und SetMouseDelay, da das Betriebssystem in diesem Modus keine Verzögerung unterstützt. Wenn SendInput jedoch wegen der unten beschriebenen Bedingungen auf SendEvent zurückfällt, verwendet es SetKeyDelay -1, 0 (es sei denn, die Tastenverzögerung von SendEvent ist -1, -1, dann wird -1, -1 verwendet). Wenn SendInput auf SendPlay wegen InputThenPlay zurückfällt, verwendet es die Tastenverzögerung von SendPlay.

Wenn das Skript einen Low-Level-Tastatur-Hook installiert hat, deinstalliert SendInput ihn automatisch vor der Ausführung und installiert ihn danach wieder. Folglich ist SendInput in der Regel nicht in der Lage, die Hook-Hotkeys oder InputHooks des Skripts auszulösen. Der Hook wird temporär deinstalliert, da seine Existenz sonst alle Vorteile von SendInput zunichtemachen würde, wodurch es dann sowohl SendPlay als auch SendEvent unterlegen wäre. Dies wird jedoch nur für den Hook des Skripts gemacht, nicht aber, wenn ein externer Hook erkannt wird, wie unten beschrieben.

Wenn ein anderes Skript als das Skript, das SendInput ausführt, einen Low-Level-Tastatur-Hook installiert hat, fällt SendInput automatisch auf SendEvent zurück (oder auf SendPlay, wenn InputThenPlay aktiv ist). Dies geschieht, weil die Existenz eines externen Hooks alle Vorteile von SendInput zunichtemachen würde, wodurch es dann sowohl SendPlay als auch SendEvent unterlegen wäre. Da SendInput jedoch nicht in der Lage ist, einen Low-Level-Hook in anderen Programmen als AutoHotkey v1.0.43+ zu erkennen, fällt es in solchen Fällen nicht zurück, wodurch es weniger zuverlässig ist als SendPlay/Event.

Wenn SendInput Mausklicks mit Mitteln wie {Click} sendet, während CoordMode Mouse, Relative aktiv ist (die Standardeinstellung), wird jeder Klick relativ zum Fenster sein, das zu Beginn des Sendens aktiv war. Wenn SendInput also absichtlich ein anderes Fenster aktiviert (z.B. mit ALT+TAB), werden die Koordinaten der nachfolgenden Klicks innerhalb desselben Befehls falsch sein, da sie immer noch relativ zum alten statt zum neuen Fenster sind.

Der SendInput-Befehl kann verwendet werden, um Tastendrücke explizit via SendInput-Modus zu senden.

Bekannte Einschränkungen:

SendPlay

Warnung: SendPlay funktioniert möglicherweise nicht, wenn die Benutzerkontensteuerung (engl. User Account Control, kurz UAC) aktiviert ist, auch wenn das Skript als Administrator ausgeführt wird. Weitere Informationen finden Sie in der FAQ.

SendPlay hat gegenüber den anderen Modi den großen Vorteil, dass es Tastendrücke und Mausklicks in einer breiteren Palette von Videospielen "wiedergeben" kann. Zum Beispiel könnte ein bestimmtes Videospiel nur Hotstrings mit der SendPlay-Option akzeptieren.

Von den drei Sendemodi ist SendPlay der ungewöhnlichste, da er an sich keine Tastendrücke und Mausklicks simuliert. Stattdessen erstellt dieser Modus eine Sequenz von Ereignissen (Meldungen), die direkt in das aktive Fenster einfließen (ähnlich wie ControlSend, aber auf einer niedrigeren Ebene). Folglich löst SendPlay keine Hotkeys oder Hotstrings aus.

Wie bei SendInput werden die Tastendrücke von SendPlay nicht mit den Tastendrücken des Benutzers vermischt. Wenn der Benutzer also während eines SendPlays etwas eingibt, werden diese Tastendrücke bis zu dessen Abschluss nach hinten verschoben.

SendPlay ist deutlich langsamer als SendInput, aber schneller als der traditionelle SendEvent-Modus (selbst bei einer Tastenverzögerung von -1).

Die Windows-Logo-Tasten (LWin und RWin) werden während eines SendPlays automatisch blockiert, wenn der Tastatur-Hook installiert ist. Dies verhindert, dass das Startmenü angezeigt wird, wenn der Benutzer während des Sendens versehentlich eine Windows-Logo-Taste drückt. Alle anderen Tasten müssen hingegen nicht blockiert werden, da das Betriebssystem diese automatisch bis zum Abschluss von SendPlay nach hinten verschiebt (via Pufferung).

SendEvent berücksichtigt die von SetKeyDelay und SetMouseDelay festgelegten Verzögerungen, sofern ihr Play-Parameter vorhanden ist. Im Gegensatz zu SendEvent verwendet SendPlay standardmäßig -1 (überhaupt keine Verzögerung).

SendPlay kann eine FESTSTELL-, NUM- oder ROLLEN-Taste weder ein- noch ausschalten. Ebenso ist es nicht in der Lage, den von GetKeyState gesehenen Status einer Taste zu ändern, es sei denn, die Tastendrücke werden an eines der eigenen Fenster des Skripts gesendet. Selbst dann können Änderungen an den linken/rechten Modifikatortasten (z.B. RControl) nur über ihre neutralen Gegenstücke (z.B. Control) erkannt werden.

Im Gegensatz zu SendInput und SendEvent kann ein SendPlay durch Drücken von Strg+Alt+Entf oder Strg+Esc unterbrochen werden. In diesem Fall werden die restlichen Tastendrücke nicht gesendet, aber das Skript wird weiter ausgeführt, als wäre SendPlay normal abgeschlossen worden.

Obwohl SendPlay LWin- und RWin-Ereignisse senden kann, werden diese direkt an das aktive Fenster gesendet, anstatt ihre native Systemfunktion auszuführen. Um das zu umgehen, verwenden Sie SendEvent. Zum Beispiel bewirkt SendEvent #r, dass das Ausführen-Dialogfenster des Startmenüs angezeigt wird.

Der SendPlay-Befehl kann verwendet werden, um Tastendrücke explizit via SendPlay-Modus zu senden.

Bekannte Einschränkungen:

Bemerkungen

Wenn SendMode nicht verwendet wird, ist der Modus standardmäßig Event.

SendMode ändert auch den Modus von Click, MouseMove, MouseClick und MouseClickDrag. Wenn Sie für ein bestimmtes Mausereignis einen anderen Modus benötigen, verwenden Sie einfach {Click}. Zum Beispiel:

SendEvent {Click 100 200}  ; SendEvent verwendet die alte, traditionelle Klickmethode.

Die Verwendung von SendMode im automatischen Ausführungsbereich (ganz oben im Skript) beeinflusst auch die Neubelegung von Tasten, insbesondere wenn SendMode Play verwendet wird; weitere Informationen finden Sie unter Einschränkungen beim Neubelegen via SendPlay.

[v1.1.23+]: Die interne Variable A_SendMode enthält die aktuelle Einstellung.

Jeder neue Thread (z.B. ein Hotkey, ein benutzerdefinierter Menüpunkt oder eine zeitgesteuerte Subroutine) verwendet zunächst die Standardeinstellung des Befehls. Diese Standardeinstellung kann geändert werden, indem der Befehl im automatischen Ausführungsbereich (ganz oben im Skript) verwendet wird.

Send, SetKeyDelay, SetMouseDelay, Click, MouseClick, MouseClickDrag, MouseMove

Beispiele

Macht Send synonym mit SendInput. Empfohlen für neue Skripte wegen der hohen Geschwindigkeit und Zuverlässigkeit.

SendMode Input

Macht Send synonym mit SendInput, fällt aber auf SendPlay zurück, wenn SendInput nicht verfügbar ist.

SendMode InputThenPlay