#IfWinActive / #IfWinNotActive / #IfWinExist / #IfWinNotExist

Erstellt kontextabhängige Hotkeys und Hotstrings. Solche Hotkeys führen je nach aktivem oder existierendem Fenster eine andere (oder gar keine) Aktion aus.

#IfWinActive FensterTitel, FensterText
#IfWinExist FensterTitel, FensterText
#IfWinNotActive FensterTitel, FensterText
#IfWinNotExist FensterTitel, FensterText
#If Ausdruck

Parameter

FensterTitel, FensterText

Wenn weggelassen, sind danach erstellte Hotkeys und Hotstrings nicht kontextabhängig. Andernfalls geben Sie für FensterTitel einen Fenstertitel oder andere Kriterien zur Identifizierung des Zielfensters und/oder für FensterText eine Teilzeichenkette aus einem Textelement des Zielfensters an (Textelemente können mit dem internen Tool "Window Spy" in Erfahrung gebracht werden).

Fenstertitel und -texte sind Groß-/Kleinschreibung-sensitiv. Standardmäßig werden versteckte Fenster nicht erkannt und versteckte Textelemente erkannt, was mit DetectHiddenWindows und DetectHiddenText im automatischen Ausführungsbereich (ganz oben im Skript) geändert werden kann. Standardmäßig muss ein Fenstertitel mit dem angegebenen FensterTitel beginnen, um eine Übereinstimmung zu sein, was mit SetTitleMatchMode im automatischen Ausführungsbereich geändert werden kann.

Diese Direktive unterstützt wie die meisten anderen Direktiven keine Variablen. Obwohl ahk_pid und ahk_id mit einer hardkodierten Prozess- oder Fenster-ID verwendet werden können, ist es für #IfWin üblicher, sie indirekt via GroupAdd oder Hotkey IfWin zu verwenden.

Die AusnahmeTitel- und AusnahmeText-Parameter, die normalerweise bei fensterspezifischen Befehlen verfügbar sind, werden nicht unterstützt, können aber indirekt verwendet werden, indem ahk_group MeineGruppe für FensterTitel angegeben wird (wobei MeineGruppe eine via GroupAdd erstellte Fenstergruppe ist, die AusnahmeTitel/Text unterstützt).

Grundlegende Bedienung

Die #IfWin-Direktiven machen es einfach, kontextabhängige Hotkeys und Hotstrings zu erstellen. Zum Beispiel:

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

Die #IfWin-Direktiven sind positionsabhängig, d.h. sie beeinflussen nur Hotkeys und Hotstrings, die sich im Skript physisch darunter befinden. Außerdem schließen sie sich gegenseitig aus, d.h. nur die aktuellste Direktive ist wirksam.

Um die Kontextabhängigkeit auszuschalten, geben Sie eine beliebige #IfWin-Direktive ohne Parameter an. Zum Beispiel:

#IfWinActive

Wenn #IfWin ausgeschaltet ist (oder nie im Skript verwendet wird), sind Hotkeys und Hotstrings für alle Fenster wirksam (es sei denn, sie wurden via Suspend oder dem Hotkey-Befehl deaktiviert).

Wenn ein Maus- oder Tastatur-Hotkey per #IfWin deaktiviert wurde, wird er seine ursprüngliche Funktion ausführen, d.h. der Hotkey wird an das aktive Fenster weitergereicht, als gäbe es ihn nicht. Es gibt eine Ausnahme: Controller-Hotkeys: Obwohl #IfWin mit diesen Hotkeys funktioniert, kann die Direktive nicht verhindern, dass andere Programme die Tastendrücke eines Controllers wahrnehmen.

#IfWin kann auch verwendet werden, um das Verhalten einer gewöhnlichen Taste wie Enter oder Leer zu ändern. Das ist nützlich, wenn ein bestimmtes Fenster diese Taste ignoriert oder eine unerwünschte Aktion ausführt. Zum Beispiel:

#IfWinActive Erinnerung ahk_class #32770  ; Das Erinnerungsfenster von Outlook.
Enter::Send !o  ; ENTER soll die markierte Erinnerung öffnen statt snoozen.
#IfWinActive

#IfWin kann wie alle anderen Direktiven nicht bedingt ausgeführt werden.

Hotkey-Varianten (-Duplikate)

Sie können einen bestimmten Hotkey oder Hotstring mehrmals im Skript definieren, indem Sie jeder Definition ein anderes IfWin-Kriterium zuweisen. Diese werden als Hotkey-Varianten bezeichnet. Zum Beispiel:

#IfWinActive ahk_class Notepad
^!c::MsgBox Sie haben STRG+ALT+C in Notepad 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 anderen Fenster als Notepad/WordPad gedrückt.

Wenn mehr als eine Variante zum Auslösen geeignet ist, wird nur die Variante ausgelöst, die dem Anfang des Skripts am nächsten ist. Die Ausnahme davon ist die globale Variante (die Variante ohne #IfWin-Kriterium): Sie hat immer die niedrigste Priorität und wird daher nur ausgelöst, wenn keine andere Variante zum Auslösen geeignet ist (diese Ausnahme gilt nicht für Hotstrings).

Beim Erstellen von Hotkey-Duplikaten spielt die Reihenfolge von Modifikatorsymbolen wie z.B. ^!+# keine Rolle. Zum Beispiel ist ^!c dasselbe wie !^c. Die Tasten müssen jedoch einheitlich geschrieben sein. Zum Beispiel ist Esc in diesem Fall nicht dasselbe wie Escape (Groß-/Kleinschreibung ist jedoch egal). Außerdem werden Hotkeys mit einem Platzhalter-Präfix (*) und Hotkeys ohne Platzhalter getrennt behandelt. Zum Beispiel hätten *F1 und F1 jeweils ihre eigenen Varianten.

Um dieselbe Hotkey-Subroutine von mehr als einer Variante ausführen zu lassen, ist es am einfachsten, einen Stapel identischer Hotkeys zu erstellen, die jeweils eine andere #IfWin-Direktive darüber haben. Zum Beispiel:

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

Alternativ kann auch eine Fenstergruppe via #IfWinActive ahk_group MeineGruppe verwendet werden.

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

Allgemeine Bemerkungen

#IfWin stellt auch bei Bedarf die ursprüngliche Funktion der Präfixtasten wieder her (eine Präfixtaste ist bspw. A bei einem Hotkey wie "a & b"). Dies geschieht immer dann, wenn für ein bestimmtes Präfix keine aktivierten Hotkeys verfügbar sind.

Nutzt man ein Gosub oder Goto, um zu einem Hotkey- oder Hotstring-Label zu springen, springt es zu der Variante, die dem Anfang des Skripts am nächsten ist.

Die Tastatur- oder Maustaste eines via #IfWin deaktivierten Hotkeys sind im Tastenverlauf innerhalb der Spalte "Type" mit einem Rautezeichen (#) gekennzeichnet. Dies kann helfen, ein Skript zu debuggen.

Variablenreferenzen wie %Var% werden derzeit nicht unterstützt. Da das in einer zukünftigen Version geändert werden könnte, sollten Prozentzeichen mit einem Escapezeichen versehen werden (`%), um eine ungewollte Variablenreferenz zu verhindern. Kommas sollten ebenfalls mit einem Escapezeichen versehen werden (`,), um zusätzliche Parameter zu unterstützen, die in zukünftigen Versionen hinzugefügt werden könnten. Um diese Einschränkung zu umgehen, können Sie GroupAdd und ahk_group verwenden.

Ein Label, dem ein Hotkey via Hotkey-Befehl zugewiesen wurde, wird von #IfWin nicht direkt beeinflusst. Nur die #IfWin-Direktive (falls vorhanden), die dem Ende des Skripts am nächsten ist, wird für alle via Hotkey-Befehl erstellte Hotkeys wirksam (es sei denn, dies wurde mit "Hotkey IfWin" geändert).

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

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- bzw. Tabulatorzeichen am Anfang und Ende eines #IfWin-Parameters notwendig sind.

Aus Performanzgründen überwacht #IfWin das angegebene Fenster nicht kontinuierlich, ob es aktiviert oder vorhanden ist. Erst wenn der Benutzer ein Hotkey oder Hotstring auslöst, sucht die Direktive nach einem passenden Fenster. Wenn die Direktive kein passendes Fenster findet, werden Tastendrücke oder Mausklicks des Benutzers unverändert an das aktive Fenster weitergegeben.

#If Ausdruck, Hotkey-Befehl, Hotkeys, Hotstrings, Suspend, WinActive(), WinExist(), SetTitleMatchMode, DetectHiddenWindows

Beispiele

Erstellt zwei Hotkeys und einen Hotstring, die nur funktionieren, wenn Notepad aktiv ist, und einen Hotkey, der für alle Fenster außer Notepad funktioniert.

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