#IfWinActive / #IfWinExist [v1.0.42+]


Erzeugt kontextsensitive Hotkeys und Hotstrings. Diese Hotkeys/Hotstrings führen abhängig vom aktiven Fenster oder von der Existenz eines Fensters unterschiedliche oder auch keine Aktionen aus.

#IfWinActive [, WinTitle, WinText]
#IfWinExist [, WinTitle, WinText]
#IfWinNotActive [, WinTitle, WinText]
#IfWinNotExist [, WinTitle, WinText]

Parameter

WinTitle Der Titel oder Teile des Titels des Zielfensters (die Übereinstimmung wird mit SetTitleMatchMode in der Auto-Execute Section bestimmt). Für eine Fensterklasse wird ahk_class ExakterKlassenName (wie vom Window Spy angezeigt), für eine Fenstergruppe ahk_group GruppenName angegeben. ahk_pid und ahk_id werden auch unterstützt, in Zusammenhang mit #IfWin werden sie aber normalerweise indirekt über GroupAdd genutzt (alternativ kann die Anweisung "Hotkey IfWin" genutzt werden). Letztlich kann die Suche durch die Angabe  mehrerer Kriterien weiter eingeschränkt werden. Beispiel: My File.txt ahk_class Notepad
WinText Ggf. muss dieser Parameter einen Teil eines einzelnen Textelements des Zielfensters enthalten (wie vom Window Spy angezeigt). Verborgene Textelemente werden erkannt, wenn DetectHiddenText in der Auto-Execute Section (der oberste Teil des Skripts) auf "On" gesetzt wurde.
ExcludeTitle
ExcludeText
Obwohl diese Parameter nicht direkt unterstützt werden, können sie indirekt mittels ahk_group MeineGruppe als WinTitle genutzt werden, weil GroupAdd beim Aufbau von MeineGruppe die Parameter ExcludeTitle/Text unterstützt.

Basisfunktionalität

Die #IfWin-Direktiven ermöglichen es, auf einfache Weise kontextsensitive Hotkeys und Hotstrings zu erstellen. Beispiel:

#IfWinActive ahk_class Notepad
#space::MsgBox Die Tasten Win+Leerzeichen wurden im Editor gedrückt.

Die #IfWin-Direktiven wirken positionsbezogen: Sie wirken auf alle Hotkeys und Hotstrings, die nachfolgend erstellt werden. Sie schließen sich außerdem gegenseitig aus: Nur die letzte Direktive hat Wirkung.

Um die Kontextsensitivität wieder auszuschalten, wird die #IfWin-Direktive ohne Parameter verwendet. Beispiel:

#IfWinActive

Wenn #IfWin ausgeschaltet oder überhaupt nicht benutzt wurde, werden alle (folgenden) Hotkeys und Hotstrings für alle Fenster aktiviert, wenn sie nicht mit Suspend oder der Hotkey-Anweisung deaktiviert werden.

Wenn ein Maus- oder Tastaturhotkey durch #IfWin deaktiviert ist, werden die Maus- bzw. Tastaturereignisse an das aktive Fernster weitergeleitet, als ob es keinen Hotkey gäbe. Davon gibt es zwei Ausnahmen:
1) Windows 95/98/Me: Ein durch #IfWin deaktivierter Hotkey wird funktionslos (verschluckt);
2) Joystick Hotkeys: Obwohl #IfWin funktioniert, wird nicht verhindert, dass andere Programme die Betätigung eines Buttons bemerken können.

Mit #IfWin kann auch die Wirkung von normalen Tasten wie Enter oder Leerzeichen verändert werden, wenn ein bestimmtes Fenster diese Tasten ignoriert oder unerwünschte Reaktionen zeigt. Beispiel:

#IfWinActive Reminders ahk_class #32770  ; Das "Erinnerungsfenster" in Outlook.
Enter::Send !o  ; Mit der "Enter" Taste wird die ausgewählte Erinnerung geöffnet, statt sie abzuschalten.
#IfWinActive

Hotkey-Varianten (Mehrfache Hotkeys)

Ein bestimmter Hotkey oder Hotstring kann mehr als einmal im Skript definiert werden, wenn jede Definition unterschiedliche #IfWin Kriterien hat. Das bezeichnet man als Hotkey-Varianten. Beispiel:

#IfWinActive ahk_class Notepad
^!c::MsgBox Die Tasten Control+Alt+C wurden im Editor gedrückt.
#IfWinActive ahk_class WordPadClass
^!c::MsgBox Die Tasten Control+Alt+C wurden in WordPad gedrückt.
#IfWinActive
^!c::MsgBox Die Tasten Control+Alt+C wurden in einem anderen Fenster (nicht Editor/WordPad) gedrückt.

Wenn die Bedingungen für mehr als eine Variante erfüllt sind, wird nur die oberste (die dem Anfang des Skripts nächste) Variante ausgeführt. Ausnahme davon ist die globale Variante (die ohne #IfWin Kriterien): Sie ist immer nachrangig und wird deshalb nur dann ausgeführt, wenn keine andere Variante in Frage kommt (diese Ausnahme gilt nicht für Hotstrings).

Bei Varianten spielt die Reihenfolge der Modifizierungstasten wie ^!+# keine Rolle. ^!c ist z.B. gleichbedeutend mit !^c. Hotkeys mit einem Wildcardpräfix (*) werden aber total getrennt von solchen ohne behandelt (Beispiel: *F1 und F1 bilden unabhängige Variantengruppen).

Wenn dieselbe Subroutine von mehr als einer Variante ausgeführt werden soll, ist der einfachste Weg die Erzeugung eines Stapels identischer Hotkeys mit unterschiedlichen #IfWin Direktiven oberhalb der Routine. Beispiel:

#IfWinActive ahk_class Notepad
#z::
#IfWinActive ahk_class WordPadClass
#z::
MsgBox Die Tasten Win+Z wurden im Editor oder in WordPad gedrückt.
return

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

Hotkey-Varianten können auch während der Laufzeit des Skripts mit Hotkey, IfWin dynamisch erzeugt werden.

Allgemeine Anmerkungen

#IfWin kann auch geeigneten Präfixtasten ihre normale Funktion zurückgeben ("a" ist eine Präfixtaste in einem Hotkey wie "a & b"). Das geschieht immer, wenn keine Hotkeys für das gegebene Präfix aktiv sind.

Wenn mit Gosub oder Goto ein Hotkey- oder Hotstringlabel angesprungen wird, wird immer die oberste Variante angesprungen.

Wenn ein Hotkey aktuell durch #IfWin deaktiviert ist, wird seine Taste oder sein Mausbutton in der Spalte "Type" der KeyHistorie mit einem #-Zeichen dargestellt. Das kann bei der Fehlersuche helfen.

Variablenreferenzen wie %Var% werden z.Zt. nicht unterstützt. Deshalb müssen Prozentzeichen (%) mit `% maskiert werden, um die künftige Unterstützung zu ermöglichen. Aus gleichem Grund müssen auch Kommata maskiert werden (`,), um das Hinzufügen weiterer Parameter in der Zukunt zu erlauben. Wenn man diese Einschränkung umgehen muss, verwendet man GroupAdd und ahk_group.

Eine Sprungmarke (label), die einem Hotkey mit der Hotkey-Anweisung zugewiesen wurde, wird von #IfWin nicht direkt beeinflusst. Stattdessen wirkt die letzte #IfWin-Direktive eines Skripts (sofern es sie gibt) auf alle Hotkeys, die mit der Hotkey-Anweisung erzeugt werden, wenn es nicht mit der Anweisung Hotkey, IfWin explizit anders festgelegt wird.

Alt-tab Hotkeys sind von #IfWin nicht betroffen, sie sind immer für alle Fenster aktiviert.

Das LastFoundWindow wird durch #IfWinActive/Exist (aber nicht durch #IfWinNotActive/NotExist) gesetzt. Beispiel:

#IfWinExist ahk_class Notepad
#n::WinActivate ; Aktiviert das mit #IfWin gefundene Fenster (LastFoundWindow).

Die Escapesequenzen `s und `t können für führende oder abschließende Leerzeichen/Tabulatorzeichen in den #IfWin Parametern verwendet werden.

Aus Gründen der Ausführungsgeschwindigkeit überprüft #IfWin nicht kontinuierlich die Aktivierung oder Existenz des Zielfensters. Stattdessen wird das Zielfenster nur dann gesucht, wenn der Hotkey/Hotstring eingegeben wird. Wenn das richtige Fenster nicht gefunden wird, wird die Taste oder der Mausklick unverändert an das aktive Fenster weitergereicht (Ausnahme: Windows 95/98/Me).

Windows 95/98/Me: Wenn die erste Variante eines Hotkeys das $-Präfix hat, können alle Varianten sich selbst senden. Durch dieses Hilfmittel können Hotkeys ihre ursprüngliche Tastenfunktion auslösen, anstatt überhaupt nicht zu tun (verschluckt zu werden). Beispiel:

$^a::Send ^a  ; Die erste Variante muss das $-Präfix haben, um sich selbst unter Windows 9x senden zu können.
#IfWinActive ahk_class Notepad
^a::MsgBox Control-A im Editor.

Fenstertitel und -text sind schreibungsabhängig. Verborgene Fenster werden nicht gefunden, wenn nicht DetectHiddenWindows in der Auto-Execute Sektion (erster Teil des Skripts) auf "On" gesetzt wurde.

Siehe auch

Hotkey command, Hotkeys, Hotstrings, Suspend, IfWinActive, IfWinExist, SetTitleMatchMode, DetectHiddenWindows

Beispiele

#IfWinActive ahk_class Notepad
^!a::MsgBox Ctrl-Alt-A im Editor. ; Dieser Hotkey hat in anderen Fenstern keine Wirkung und wird "durchgereicht". #c::MsgBox Die Tasten Win+C wurden im Editor gedrückt. ::btw::Dieser Ersatztext für "btw" erscheint nur im Editor. #IfWinActive #c::MsgBox Die Tasten Win+C wurden in einem anderen Fenster (nicht Editor) gedrückt.