#HotIf

Erstellt kontextabhängige Hotkeys und Hotstrings. Diese führen je nach Bedingung (ein Ausdruck) eine andere (oder gar keine) Aktion aus.

#HotIf Ausdruck

Parameter

Ausdruck

Typ: Boolesch

Wenn weggelassen, sind danach erstellte Hotkeys und Hotstrings nicht kontextabhängig. Andernfalls geben Sie einen beliebigen gültigen Ausdruck an. Dies wird zum Rückgabewert einer impliziten Funktion, die einen Parameter hat (ThisHotkey). Die Funktion kann globale Variablen nicht direkt ändern (da sie wie üblich eine Assume-Local-Funktion ist und keine Deklarationen enthalten darf), aber sie kann andere Funktionen aufrufen, die dies tun.

Grundlegende Bedienung

Die #HotIf-Direktive bestimmt den Ausdruck, der von nachfolgend erstellten Hotkeys und Hotstrings verwendet wird, um festzustellen, ob sie aktiviert werden sollen. Dieser Ausdruck wird ausgewertet, wenn die Tastaturtaste, Maustaste oder Kombination des Hotkeys gedrückt wird, wenn die Abkürzung des Hotstrings eingegeben wird oder zu anderen Zeiten, wenn das Programm wissen muss, ob der Hotkey oder Hotstring aktiv ist.

Um Hotkeys und Hotstrings kontextabhängig zu machen, stellen Sie ihnen einfach die #HotIf-Direktive voran. Zum Beispiel:

#HotIf WinActive("ahk_class Notepad") or WinActive(MeinFensterTitel)
#Space::MsgBox "Sie haben WIN+LEERTASTE in Notepad oder " MeinFensterTitel " gedrückt."
:X:bzw::MsgBox "Sie haben bzw in Notepad oder " MeinFensterTitel " eingegeben."

Die #HotIf-Direktive ist positionsabhängig, d.h. sie beeinflusst nur Hotkeys und Hotstrings, die sich im Skript physisch darunter befinden, bis zur nächsten #HotIf-Direktive.

Hinweis: Im Gegensatz zu if-Anweisungen sind geschweifte Klammern bei der #HotIf-Direktive wirkungslos.

Die #HotIf-Direktive hat nur Einfluss auf Hotkeys und Hotstrings, die mit der Zweifach-Doppelpunkt-Syntax erstellt wurden, wie z.B. ^!c:: oder ::btw::. Für Hotkeys und Hotstrings, die mit der Hotkey- oder Hotstring-Funktion erstellt wurden, können Sie die HotIf-Funktion verwenden.

Um die Kontextabhängigkeit auszuschalten, geben Sie #HotIf ohne Parameter an. Zum Beispiel:

#HotIf

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

Wenn ein Maus- oder Tastatur-Hotkey per #HotIf 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 #HotIf mit diesen Hotkeys funktioniert, kann die Direktive nicht verhindern, dass andere Programme die Tastendrücke eines Controllers wahrnehmen.

#HotIf 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:

#HotIf WinActive("Erinnerung ahk_class #32770")  ; Das Erinnerungsfenster von Outlook.
Enter::Send "!o"  ; ENTER soll die markierte Erinnerung öffnen statt snoozen.
#HotIf

Varianten (Duplikate)

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

#HotIf WinActive("ahk_class Notepad")
^!c::MsgBox "Sie haben STRG+ALT+C in Notepad gedrückt."
#HotIf WinActive("ahk_class WordPadClass")
^!c::MsgBox "Sie haben STRG+ALT+C in WordPad gedrückt."
#HotIf
^!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 HotIf-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.

Eine Fenstergruppe kann verwendet werden, um einen Hotkey oder Hotstring für eine Gruppe von Fenstern auszuführen. Zum Beispiel:

GroupAdd "MeineGruppe", "ahk_class Notepad"
GroupAdd "MeineGruppe", "ahk_class WordPadClass"

#HotIf WinActive("ahk_group MeineGruppe")
#z::MsgBox "Sie haben WIN+Z entweder in Notepad oder WordPad gedrückt."

Um Hotkey- oder Hotstring-Varianten dynamisch zu erstellen (während das Skript läuft), siehe HotIf.

Ausdrucksauswertung

Sobald die Tastatur-, Maus- oder Controllertastenkombination des Hotkeys gedrückt oder die Abkürzung des Hotstrings eingegeben wird, wird der #HotIf-Ausdruck ausgewertet, um zu prüfen, ob der Hotkey oder Hotstring aktiviert werden soll.

Hinweis: Ein Skript sollte nicht davon ausgehen, dass der Ausdruck nur beim Drücken der Hotkey-Taste ausgewertet wird (siehe unten).

Der Ausdruck kann auch ausgewertet werden, wenn das Programm wissen muss, ob der Hotkey aktiv ist. Zum Beispiel könnte der #HotIf-Ausdruck einer benutzerdefinierten Kombination wie a & b:: auch ausgewertet werden, wenn die Präfixtaste (a in diesem Fall) gedrückt wird, um zu prüfen, ob sie als benutzerdefinierte Modifikatortaste fungieren soll.

Hinweis: Die Nutzung von #HotIf in einem nicht reagierenden Skript kann eine Eingabeverzögerung verursachen oder Hotkeys und Hotstrings stören (siehe unten).

Für die #HotIf-Direktive gibt es noch einige weitere Vorbehalte:

ThisHotkey, A_ThisHotkey und A_TimeSinceThisHotkey werden auf Basis des Hotkeys oder nicht-automatisch-ersetzenden Hotstrings gesetzt, den der aktuelle #HotIf-Ausdruck gerade auswertet.

A_PriorHotkey und A_TimeSincePriorHotkey enthalten temporär die vorherigen Werte der entsprechenden "This"-Variablen.

Optimierung

#HotIf ist optimiert, um die Auswertung von Ausdrücken für einfache WinActive- oder WinExist-Aufrufe zu vermeiden, wodurch das Risiko von Verzögerungen oder anderen Problemen in solchen Fällen reduziert wird. Konkret heißt das:

Wenn der Ausdruck diese Kriterien erfüllt, wird er direkt vom Programm ausgewertet und erscheint nicht in ListLines.

Bevor mit der Hotkey- oder Hotstring-Funktion eine existierende Hotkey- oder Hotstring-Variante geändert wird, muss in der Regel die HotIf-Funktion mit dem ursprünglichen Ausdruckstext verwendet werden. Der erste eindeutige Ausdruck mit einer bestimmten Kombination von Kriterien kann jedoch auch von diesen Kriterien referenziert werden. Zum Beispiel:

HotIfWinExist "ahk_class Notepad"
Hotkey "#n", "Off"  ; Schaltet den Hotkey aus.
HotIf 'WinExist("ahk_class Notepad")'
Hotkey "#n", "On"   ; Schaltet denselben Hotkey wieder ein.

#HotIf WinExist("ahk_class Notepad")
#n::WinActivate

Beachten Sie, dass die Verwendung von Variablen den Ausdruck disqualifiziert. Wenn sich der Wert der Variable nach der Erstellung des Hotkeys oder Hotstrings nicht ändert, gibt es zwei Strategien, um das Risiko von Verzögerungen oder anderen Problemen im Zusammenhang mit #HotIf zu minimieren:

Allgemeine Bemerkungen

#HotIf 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.

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

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

Das Zuletzt Gefundene Fenster kann via #HotIf gesetzt werden. Zum Beispiel:

#HotIf WinExist("ahk_class Notepad")
#n::WinActivate  ; Aktiviert das gefundene Fenster von WinExist().

Mit #HotIfTimeout kann das Zeitlimit geändert werden.

Hotkey-Funktion, Hotkeys, Hotstring-Funktion, 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.

#HotIf WinActive("ahk_class Notepad")
^!a::MsgBox "Sie haben STRG+ALT+A gedrückt, während Notepad aktiv ist."
#c::MsgBox "Sie haben WIN+C gedrückt, während Notepad aktiv war."
::bzw::Dieser Ersatztext für "bzw" erscheint nur in Notepad.
#HotIf
#c::MsgBox "Sie haben WIN+C in einem anderen Fenster als Notepad gedrückt."

Ermöglicht das Einstellen der Lautstärke durch Drehen des Mausrads über der Taskleiste.

#HotIf MausIstÜber("ahk_class Shell_TrayWnd")
WheelUp::Send "{Volume_Up}"
WheelDown::Send "{Volume_Down}"

MausIstÜber(FensterTitel) {
    MouseGetPos ,, &Fenster
    return WinExist(FensterTitel " ahk_id " Fenster)
}

Einfache wortlöschende Tastaturkurzbefehle für alle Eingabefelder.

#HotIf AktivesSteuerelementIstKlasse("Edit")
^BS::Send "^+{Left}{Del}"
^Del::Send "^+{Right}{Del}"

AktivesSteuerelementIstKlasse(Klasse) {
    FokussiertesStrlmnt := 0
    try FokussiertesStrlmnt := ControlGetFocus("A")
    FokussiertesStrlmntKlasse := ""
    try FokussiertesStrlmntKlasse := WinGetClass(FokussiertesStrlmnt)
    return (FokussiertesStrlmntKlasse=Klasse)
}

Kontextunabhängiger Hotkey.

#HotIf
Esc::ExitApp

Dynamische Hotkeys. Dieses Beispiel muss mit Beispiel #2 kombiniert werden, bevor es ausgeführt wird.

NumpadAdd::
{
    static toggle := false
    HotIf 'MausIstÜber("ahk_class Shell_TrayWnd")'
    if (toggle := !toggle)
        Hotkey "WheelUp", ZweimalHoch
    else
        Hotkey "WheelUp", "WheelUp"
    return
    ; Verschachtelte Funktion:	
    ZweimalHoch(ThisHotkey) => Send("{Volume_Up 2}")
}