If WinActive

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
LuckyJoe
Posts: 340
Joined: 02 Oct 2013, 09:52

If WinActive

17 Sep 2018, 02:47

Hallo zusammen,

ich habe eine Sammlung von Tastaturkürzeln mit AHK zusammengestellt, bei der ich folgendes Problem habe:

Das Konstrukt

Code: Select all

#IfWinActive, ahk_exe AcroRd32.exe
    ^NumpadAdd::SendInput, ^0
    ^NumpadSub::SendInput, ^1
#IfWinActive
funktioniert einwandfrei, allerdings sagt mirt die Hilfe: "Veraltet: Dieser Befehl ist nicht für neue Skripte empfohlen. Verwenden Sie stattdessen die WinActive-Funktion." Dementsprechend habe ich das umgeschrieben zu

Code: Select all

If WinActive("ahk_exe AcroRd32.exe")
{
    ^NumpadAdd::SendInput, ^0
    ^NumpadSub::SendInput, ^1
}
Return
Das funktioniert zwar beim Acrobat-Reader auch, aber dann sind Strg-NumPadAdd und Strg-NumPadSub in anderen Programmen nicht mehr verfügbar (z.B. Total-Commander zum An-/Abwählen von Markierungen). Was mache ich falsch?

VG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: If WinActive

17 Sep 2018, 02:56

#IfWinActive ist weder veraltet noch wird nicht empfohlen es zu verwenden.
Genauer gesagt ist es für #If besser #IfWinActive zu verwenden anstatt #If (Das hat damit zu tun wie #If functioniert.)
Was du hier verwechselst sind die Ifs ohne und mit #.
Wenn dein zweiter Code funktionieren Sollte müsstest due die {} entfernen und #If anstatt If verwenden.
Recommends AHK Studio
User avatar
LuckyJoe
Posts: 340
Joined: 02 Oct 2013, 09:52

Re: If WinActive

17 Sep 2018, 03:26

Hallo nnnik,

danke für die Unterstützung - funktioniert ohne die "{}" :-)
Wie ist denn der korrekte Abschluß des Codeblocks: "Return" oder "#If"? Welcher Aufruf ist denn "besser":

Code: Select all

#If WinActive("ahk_exe AcroRd32.exe") ...
oder

Code: Select all

#IfWinActive, ahk_exe AcroRd32.exe ...
Ich verstehe den Unterschied nicht ganz.

VG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: If WinActive

17 Sep 2018, 04:30

#If ist ein Präprozessorinstruktion.
Sie wird unabhängig von den ganzen anderen normalen Ausführungsverläufen und Abläufen behandelt.
return - welches zum Steuern des normalen Ausführungsverlaufes verwendet wird - hat daher keinen Einfluss auf #If.

#IfWinActive ist besser als #If WinActive().
Dazu muss ich ein bisschen ausholen.
Wenn du mit AHK #if verwendest dann empfängt AHK die Hotkeys über einen Keyboard Hook.
Das bedeutet wenn du einen Knopf drückst wird eine AHK eigene C++ Funktion aufgerufen welche bestimmen muss, ob das #If aktiviert oder deaktiviert ist.
Daraufhin muss AHK eine Antwort abgeben - unterbreche ich diesen Tastendruck oder wird er weitergeleitet?
Wenn du #IfWinActive hast ist das für AHK ganz einfach - es führt einfach winactive in C++ aus und gibt die Antwort zurück.
Bei #If ist das schon schwieriger - AHK muss erst dem Interpreter sagen, dass er den code im #if ausführen muss.
Nun dass an sich ist schon ein ziemlicher Akt - jetzt kann es aber noch zusätzlich sein, dass der Interpreter gerade mit etwas anderem Beschäftigt ist was nicht unterbrochen werden darf.
Also wartet AHK hier bis dass eine Antwort vom Interpreter kommt und das kann Teilweise je nachdem was du programmiert hast ein paar Sekunden dauern.
Normalerweise kein großes Problem. Allerdings befinden wir uns immer noch in einer Funktion die von Windows aufgerufen wird sobald eine Taste gedrückt wird.
Windows erwartet möglichst schnell eine Antwort, sodass das nächste Programm aufgerufen werden kann welches Hooks verwendet, damit dieses auch dann möglichst schnell wieder Antwortet damit Windows dann und so weiter und sofort.
Das alles soll möglichst schnell gehen damit der Benutzer seine Eingabe möglichst schnell sehen kann.
Wenn AHK jetzt aber ne Sekunde braucht um zu bestimmen ob eine Taste durchgelassen werden soll oder nicht, verzögert sich alles um eine Sekunde - das heißt du hast eine Tipp Geschwindigkeit von 1 Taste pro Sekunde.
Für die meisten Benutzer ist so eine Geschwindigkeit schlichtweg inakzeptabel und Windows wird versuchen alles schneller zu machen.
Es macht dies in dem es Programme die zu Lange zum Antworten brauchen einfach nicht mehr fragt.
Und dann war es das mit dem AHK Keyboard Hook und allen Hotkeys die darauf basieren.
AHK wird auch nicht gewarnt oder so - also kann es sein, dass einfach alle Hotkeys deaktiviert sind.
Recommends AHK Studio
User avatar
LuckyJoe
Posts: 340
Joined: 02 Oct 2013, 09:52

Re: If WinActive

17 Sep 2018, 05:10

Hi nnnik,

Danke für die ausführliche Erklärung - cool, habe ich jetzt verstanden, weil es in der Hilfe nicht so deutlich wurde :-)

VG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: If WinActive

02 Oct 2018, 16:52

Hallo nnik!

Hier möchte ich zum selben Thema auch noch zwei Fragen anhängen:

Ich habe die bedingten Codeblöcke dann immer mit #If abgeschlossen. Bedeuten die obigen Erläuterungen auch, daß man das besser mit #IfWinActive machen sollte? Ich nehme mal an, desgleichen gilt dann auch für #IfWinNotActive ?

Und dann habe ich für ein Script, das spezifisch für den Windows Explorer bestimmt sein sollte, hier mal folgenden Code bekommen:

Code: Select all

#If WinActive("ahk_class ExploreWClass") || WinActive("ahk_class CabinetWClass")
...
#If
Kann oder sollte man das nach dem, was Du hier gesagt hast, noch eleganter umschreiben?

Viele Grüße von Meister Lampe
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: If WinActive

03 Oct 2018, 02:00

Deaktivieren kannst du immer mit #if. Kein Problem wird auftauchen solange nichts ausgeführt wird und bei einem Deaktivierten #if wird nichts ausgeführt.

Du könntest 2 Fenster machen indem du sie zu einer Group zusammenfasst, außerdem kannst du mit dem Titlematchmode RegexMatch arbeiten.
Recommends AHK Studio
User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: If WinActive

05 Oct 2018, 12:14

Hallo nnnik!

Vielen Dank für den Hinweis!
Kannst du mir auch sagen, was der Unterschied ist zwischen SetTitleMatchMode RegEx und SetTitleMatchMode RegExMatch ?
Oder spielt das in diesem Zusammenhang keine Rolle?

Viele Grüße von Meister Lampe
just me
Posts: 9442
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: If WinActive

05 Oct 2018, 16:16

Hallo,

das SetTitleMatchMode RegExMatch ist wohl ein Flüchtigkeitsfehler. Das kann man leicht selbst feststellen, indem man es einfach mal ausprobiert. Mit AHK 1.1.30.00 wirft das bei mir einen Parameterfehler aus.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: If WinActive

06 Oct 2018, 00:58

Der Titlematchmode RegExMatch ist weder ein Fehler noch etwas anderes als der Mode RegEx. Es ist ein synonym für das letztere in der Form von Pseudocode.
Recommends AHK Studio

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 23 guests