#IfWinActive / #IfWinExist

Erstellt kontextabhängige Hotkeys und Hotstrings. Solche Hotkeys können je nach Typ des aktiven oder vorhandenen Fensters unterschiedliche (oder gar keine) Aktionen ausführen.

#IfWinActive [, Fenstertitel, Fenstertext]
#IfWinExist [, Fenstertitel, Fenstertext]
#IfWinNotActive [, Fenstertitel, Fenstertext]
#IfWinNotExist [, Fenstertitel, Fenstertext]
#If [, Ausdruck]

Parameter

Fenstertitel

Ein Fenstertitel oder sonstige Kriterien, die das Zielfenster ermitteln sollen. Siehe Fenstertitel.

Das Übereinstimmungsverhalten kann mit SetTitleMatchMode innerhalb des automatischen Ausführungsbereichs eingestellt werden.

Wie bei den meisten Direktiven auch, werden Variablen nicht unterstützt. Es ist möglich, per ahk_pid und ahk_id einen hartcodierten Prozess oder eine Fenster-ID anzugeben. Allerdings ist es bei #IfWin üblicher, diese indirekt über GroupAdd oder Hotkey IfWin zu verwenden.

Fenstertext

In diesem Parameter kann eine Zeichenkette angegeben werden, die in einem Textelement des Zielfensters vorkommt (abrufbar mit Windows Spy). Versteckte Textelemente werden auch erkannt, sofern DetectHiddenText im automatischen Ausführungsbereich (oberste Bereich des Skripts) aktiv ist.

Titelausnahme
Textausnahme

Diese Parameter werden nicht unterstützt. Allerdings können sie mithilfe von ahk_group MeineGruppe indirekt im Fenstertitel verwendet werden (MeineGruppe kann mit dem GroupAdd-Befehl erstellt werden, der Titel- und Textausnahme unterstützt).

Grundlagen zur Bedienung

Mit #IfWin-Direktiven können auf einfache Weise kontextabhängige Hotkeys und Hotstrings erstellt werden. Zum Beispiel:

#IfWinActive ahk_class Notepad
#space::MsgBox Sie haben WIN+LEERTASTE im Editor gedrückt.

Die #IfWin-Direktiven sind von der Position abhängig: sie beeinflussen nur Hotkeys und Hotstrings, die sich im Skript physisch darunter befinden. Zudem schließen sie sich gegenseitig aus; das heißt, dass nur die aktuellste Direktive wirksam sein wird.

Um die Kontextabhängigkeit zu deaktivieren, muss eine #IfWin-Direktive ohne Parameter angegeben werden. Zum Beispiel:

#IfWinActive

Falls #IfWin deaktiviert ist (oder nie in einem Skript verwendet wird), gelten Hotkeys und Hotstrings für alle Fenster (sofern sie nicht per Suspend oder Hotkey deaktiviert wurden).

Wenn ein Maus- oder Tastatur-Hotkey per #IfWin deaktiviert wurde, wird er seine ursprüngliche Funktion ausführen; das heißt, dass er an das aktive Fenster gesendet wird, als gäbe es den Hotkey nicht. Es gibt eine Ausnahme: Joystick-Hotkeys: #IfWin-Direktiven werden zwar funktionieren, aber es kann nicht verhindert werden, dass andere Programme das Drücken einer Joystick-Taste erkennen können.

Mit #IfWin kann man auch das Verhalten einer gewöhnlichen Taste wie ENTER oder LEERTASTE ändern. Das ist besonders bei Fenstern nützlich, die diese Taste ignorieren oder unerwünschte Aktionen ausführen. Zum Beispiel:

#IfWinActive Erinnerung ahk_class #32770  ; Das Erinnerungsfenster von Outlook.
Enter::Send !o  ; ENTER wird die markierte Erinnerung öffnen, anstatt sie in den Snooze-Modus zu versetzen.
#IfWinActive

Hotkey-Varianten (-Duplikate)

Es ist möglich, einen bestimmten Hotkey oder Hotstring mehr als einmal im Skript zu definieren, wenn für jede Definition ein anderes IfWin-Kriterium verwendet wird. Diese werden als Hotkey-Varianten bezeichnet. Zum Beispiel:

#IfWinActive ahk_class Notepad
^!c::MsgBox Sie haben STRG+ALT+C im Editor gedrückt.
#IfWinActive ahk_class WordPadClass
^!c::MsgBox Sie haben STRG+ALT+C in WordPad gedrückt.
#IfWinActive
^!c::MsgBox Sie haben STRG+ALT+C in einem beliebigen Fenster gedrückt (außer Editor/WordPad).

Wenn mehrere Varianten zum Ausführen berechtigt sind, wird nur die eine ausgelöst, die ganz oben im Skript vorkommt. Ausgenommen davon ist die globale Variante (das ist die ohne #IfWin-Kriterien): Sie hat immer die niedrigste Priorität; das heißt, dass sie nur ausgeführt wird, wenn keine andere Variante dazu berechtigt ist (diese Ausnahme gilt nicht für Hotstrings).

Beim Erstellen von Hotkey-Duplikaten spielt die Reihenfolge der Modifikatorzeichen (z. B. ^!+#) keine Rolle. Zum Beispiel wäre ^!c das gleiche wie !^c. Allerdings müssen die Tasten konsequent ausgeschrieben werden. Zum Beispiel wäre in diesem Fall Esc nicht das gleiche wie Escape (die Groß- und Kleinschreibung ist hingegen egal). Außerdem werden Hotkeys mit einem Platzhalter-Präfix (*) und Hotkeys ohne Platzhalter getrennt behandelt; zum Beispiel würden *F1 und F1 jeweils ihre eigenen Varianten haben.

Wenn eine einzelne Hotkey-Subroutine von mehreren Varianten ausführbar sein soll, erstellt man einfach eine Reihe von identischen Hotkeys, die darüber jeweils eine andere #IfWin-Direktive haben. Zum Beispiel:

#IfWinActive ahk_class Notepad
#z::
#IfWinActive ahk_class WordPadClass
#z::
MsgBox Sie haben WIN+Z entweder im Editor oder in WordPad gedrückt.
return

Alternativ kann eine Fenstergruppe per #IfWinActive ahk_group MeineGruppe verwendet werden.

Um Hotkey-Varianten dynamisch zu erstellen (während das Skript läuft), siehe "Hotkey IfWin".

Allgemeine Bemerkungen

Bei Bedarf wird #IfWin außerdem die ursprüngliche Funktion der Präfixtasten wiederherstellen (eine Präfixtaste ist beispielsweise die A-Taste bei einem Hotkey wie "a & b"). Dieser Sachverhalt geschieht immer dann, wenn keine aktivierten Hotkeys für ein angegebenes Präfix vorhanden sind.

Wenn mit Gosub oder Goto ein Hotkey- oder Hotstring-Label angesprungen werden soll, wird dieser zu der Variante springen, die ganz oben im Skript vorkommt.

Wurde ein Hotkey per #IfWin deaktiviert, erscheint seine Tastatur- oder Maustaste in der Type-Spalte von KeyHistory mit einem "#"-Zeichen. Diese Sache kann dabei helfen, ein Skript zu debuggen.

Variablenverweise wie %Var% werden zurzeit nicht unterstützt. Das heißt, dass Prozentzeichen mit einem Escapezeichen versehen werden müssen (`%), wenn sie literal sein sollen. Literale Kommas müssen ebenso mit einem Escapezeichen versehen werden (`,), um das Hinzufügen von zusätzlichen Parametern für die Zukunft zu ermöglichen. Um diese Einschränkung zu umgehen, verwende GroupAdd und ahk_group.

Ein Label, dem ein Hotkey mit dem Hotkey-Befehl zugewiesen worden ist, wird von #IfWin nicht direkt beeinflusst. Stattdessen wird die #IfWin-Direktive ganz unten im Skript (falls vorhanden) für alle per Hotkey-Befehl erstellte Hotkeys wirksam (sofern das nicht mit "Hotkey IfWin" geändert wurde).

Alt-Tab-Hotkeys werden nicht von #IfWin beeinflusst: sie sind für alle Fenster aktiv.

Das Zuletzt Gefundene Fenster wird von #IfWinActive/Exist gesetzt (aber nicht von IfWinNotActive/NotExist). Zum Beispiel:

#IfWinExist ahk_class Notepad
#n::WinActivate  ; Aktiviert das gefundene Fenster von #IfWin.

Die Escapesequenzen `s und `t können verwendet werden, wenn Leer-/Tabulatorzeichen am Anfang oder Ende eines #IfWin-Parameters notwendig sind.

Aus Performancegründen erfolgt keine ständige Überwachung des angegebenen Fensters, ob es aktiviert oder vorhanden ist. Die Direktive wird ein passendes Fenster nur suchen, wenn der Benutzer ein Hotkey oder Hotstring auslöst. Wenn die Direktive kein passendes Fenster findet, dürfen Tastatureingaben oder Mausklicks des Benutzers unverändert an das aktive Fenster übergeben werden.

Fenstertitel und -texte unterscheiden zwischen Groß- und Kleinschreibung. Versteckte Fenster werden nur erkannt, wenn DetectHiddenWindows im automatischen Ausführungsbereich aktiviert ist (der oberste Bereich des Skripts).

Siehe auch

#If Ausdruck, Hotkey-Befehl, Hotkeys, Hotstrings, Suspend, IfWinActive, IfWinExist, SetTitleMatchMode, DetectHiddenWindows

Beispiele

#IfWinActive ahk_class Notepad
^!a::MsgBox Sie haben STRG+ALT+A gedrückt, während der Editor aktiv war.  ; Dieser Hotkey wird nicht funktionieren, wenn er in einem anderen Fenster gedrückt wird.
#c::MsgBox Sie haben WIN+C gedrückt, während der Editor aktiv war.
::btw::Dieser Ersatztext für "btw" erscheint nur im Editor.
#IfWinActive
#c::MsgBox Sie haben WIN+C in einem Fenster gedrückt, das nicht der Editor war.