#IfWinActive / #IfWinExist

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

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

Parameter

Fenstertitel

Der Titel oder andere Möglichkeiten zum Identifizieren des Zielfensters. Weitere Informationen finden Sie auf der Seite Fenstertitel-Parameter & Zuletzt Gefundenes Fenster.

Das Übereinstimmungsverhalten des Titels wird durch SetTitleMatchMode bestimmt, das im automatischen Ausführungsbereich angegeben ist.

Diese Direktive unterstützt wie die meisten anderen Direktiven keine Variablen. Obwohl ahk_pid und ahk_id genutzt werden können, um ein Fenster via Prozess oder Fenster-ID anzusteuern, nutzt man sie bei #IfWin meistens indirekt, indem man sie in Verbindung mit GroupAdd oder Hotkey IfWin setzt.

Fenstertext

Eine Zeichenkette, die in einem der Textelemente des Zielfensters enthalten ist (eventuell vorhandene Textelemente können mit dem mitgelieferten Windows Spy Tool aufgedeckt werden). Um versteckte Textelemente einzubeziehen, schaltet man DetectHiddenText im automatischen Ausführungsbereich (oberster Bereich des Skripts) ein.

Titelausnahme
Textausnahme

Obwohl diese Parameter nicht unterstützt werden, können sie indirekt genutzt werden, indem man ahk_group MeineGruppe im Fenstertitel-Parameter angibt (wobei MeineGruppe eine via GroupAdd erstellte Fenstergruppe ist, die Titel-/Textausnahme unterstützt).

Grundlagen zur Bedienung

Die #IfWin-Direktiven können genutzt werden, um auf einfache Weise kontextabhängige Hotkeys und Hotstrings zu erstellen. Zum Beispiel:

#IfWinActive ahk_class Notepad
#space::MsgBox Sie haben WIN+LEERTASTE im Texteditor 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, gibt man eine beliebige #IfWin-Direktive an und lässt all ihre Parameter weg. Zum Beispiel:

#IfWinActive

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

Wenn ein Maus- oder Tastatur-Hotkey per #IfWin deaktiviert wurde, wird er seine ursprüngliche Funktion ausführen; das heißt, dass die Tasten an das aktive Fenster gesendet werden, als gäbe es diesen Hotkey nicht. Es gibt eine Ausnahme: Joystick-Hotkeys: Obwohl #IfWin bei diesen Hotkeys funktioniert, kann die Direktive nicht verhindern, dass andere Programme den Tastendruck eines Joysticks wahrnehmen.

#IfWin kann auch genutzt werden, um das Verhalten einer gewöhnlichen Taste wie ENTER oder LEERTASTE zu ändern. Das ist nützlich, wenn ein bestimmtes Fenster diese Taste ignoriert oder eine Aktion ausführt, die unerwünscht ist. 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)

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

#IfWinActive ahk_class Notepad
^!c::MsgBox Sie haben STRG+ALT+C im Texteditor 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 Texteditor/WordPad).

Sollte der Fall eintreten, dass mehrere Varianten ausgelöst werden können, hat die erste gefundene Variante im Skript die höchste Priorität. Die Ausnahme hiervon ist die globale Variante (die Variante ohne #IfWin-Kriterium): Sie hat immer die niedrigste Priorität; das heißt, dass sie nur ausgelöst wird, wenn keine andere Variante infrage kommt (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. Die Schreibweise der Tasten muss jedoch konsistent sein. Esc beispielsweise ist in diesem Zusammenhang nicht das gleiche wie Escape (die Groß- und Kleinschreibung hingegen ist 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, sie übereinander zu stapeln und jeweils eine andere #IfWin-Direktive darüber zu setzen. Zum Beispiel:

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

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

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

Allgemeine Bemerkungen

Wenn nötig, stellt #IfWin außerdem die ursprüngliche Funktion der Präfixtasten wieder her (eine Präfixtaste ist beispielsweise die A-Taste bei einem Hotkey wie "a & b"). Dies geschieht immer dann, wenn für ein bestimmtes Präfix keine aktivierten Hotkeys verfügbar sind.

Gosub oder Goto, das einen Hotkey- oder Hotstring-Label als Ziel hat, springt zur ersten gefundenen Variante im Skript.

Wenn ein Hotkey via #IfWin deaktiviert ist, enthält die in der KeyHistory befindliche Type-Spalte der entsprechenden Tastatur- oder Maustaste ein "#"-Zeichen. Dies kann dazu beitragen, ein Skript zu debuggen.

Variablenverweise wie %Var% werden zurzeit nicht unterstützt. Da das in einer zukünftigen Version geändert werden könnte, sollten Prozentzeichen mit einem Escapezeichen versehen werden (`%), um einen ungewollten Variablenverweis zu verhindern. Kommas sollten ebenfalls mit einem Escapezeichen versehen werden (`,), um zukünftige Probleme zu vermeiden, falls weitere Parameter hinzugefügt werden. Um diese Einschränkung zu umgehen, verwendet man GroupAdd und ahk_group.

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

Alt-Tab-Hotkeys werden nicht von #IfWin 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 genutzt werden, um Leer-/Tabulatorzeichen am Anfang oder Ende eines #IfWin-Parameters zu setzen.

Aus Performancegründen überwacht #IfWin das angegebene Fenster nicht kontinuierlich, ob es aktiviert oder vorhanden ist. Nur wenn der Benutzer ein Hotkey oder Hotstring auslöst, sucht die Direktive ein geeignetes Fenster. Wenn die Direktive kein geeignetes Fenster findet, werden Tastatureingaben oder Mausklicks des Benutzers unverändert an das aktive Fenster weitergereicht.

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

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 Texteditor aktiv ist.  ; 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 Texteditor aktiv ist.
::bzw::Dieser Ersatztext für "bzw" wird nur im Texteditor erscheinen.
#IfWinActive
#c::MsgBox Sie haben WIN+C in einem Fenster gedrückt`, das nicht der Texteditor ist.