#IfWin[Not]Active

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

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

#IfWin[Not]Active

20 Nov 2018, 12:57

Hallo zusammen,

ich stehe gerade bei IfWinNotActive auf dem Schlauch. Ich möchte F5 einer Routine zuordnen, die aber nicht innerhalb des TotalCommanders und nicht bei Chrome ausgelöst werden soll:

Code: Select all

#IfWinNotActive ahk_class TTOTAL_CMD
	F5::
		MsgBox "Hier ist die F5-Routine ..."
	Return
#IfWinNotActive
So funktioniert das nur mit dem TotalComamnder - aber wie kann ich das auch mit Chrome.exe kombinieren (und/oder weiteren Programmen, die ich davon ausschließen möchte)?
Da meine Routine bei vielen anderen Programmen (überall, wo Text editiert werden kann) laufen soll, kann ich auch nicht mit #IfWinActive arbeiten.

Hat jemand eine Idee?

Danke im Voraus
VG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
gregster
Posts: 8921
Joined: 30 Sep 2013, 06:48

Re: #IfWin[Not]Active

20 Nov 2018, 13:12

Mit #If kann man auch komplexere Ausdrücke (aka expressions) verwenden:

Code: Select all

#If !(WinActive("ahk_class Notepad") or WinActive("ahk_class Chrome_WidgetWin_1"))
F5::MsgBox Weder Notepad noch Chrome ist aktiv!
#If
! steht für ein logisches not
User avatar
LuckyJoe
Posts: 335
Joined: 02 Oct 2013, 09:52

Re: #IfWin[Not]Active

20 Nov 2018, 13:16

... jepp! - Danke :-)
Herzliche Grüße aus dem Rheinland
Lucky Joe
swagfag
Posts: 6222
Joined: 11 Jan 2017, 17:59

Re: #IfWin[Not]Active

20 Nov 2018, 14:37

ahk_group
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: #IfWin[Not]Active

20 Nov 2018, 15:30

Bei #If ist es besser nicht mit Ausdrücken zu arbeiten (anders als beim normalen if).
Von daher wäre es sinnvoll die von swagfag erwähnte ahk_group zu verwenden.
Recommends AHK Studio
gregster
Posts: 8921
Joined: 30 Sep 2013, 06:48

Re: #IfWin[Not]Active

20 Nov 2018, 16:15

nnnik wrote:
20 Nov 2018, 15:30
Bei #If ist es besser nicht mit Ausdrücken zu arbeiten (anders als beim normalen if).
Von daher wäre es sinnvoll die von swagfag erwähnte ahk_group zu verwenden.
Meiner Erfahrung nach ist die Verwendung von #If in einem derartigen Fall regelmäßig noch vertretbar. Je länger der Ausdruck braucht (bspw. bei deutlich mehr Fenstern) oder je beschäftigter das Skript oder der Computer ist, desto eher nicht mehr. Aber ahk-Group ist bestimmt eine gute Alternative. :thumbup:
Und Ausdrücke sind überhaupt der einzige Anwendungsfall für #If und Grund für dessen Existenz (abgesehen vom Abschalten der Kontextsensitivität, für das es jedoch auch andere Möglichkeiten gibt)... können natürlich auch gänzlich andere Ausdrücke als hier sein, die den Fensterbereich (und ahk_group) gar nicht tangieren.
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: #IfWin[Not]Active

20 Nov 2018, 18:25

Ich meinte damit, dass #If weniger verwendet werden sollte, als die anderen Alternativen wie z.B. #IfWinActive.
Im Gegensatz dazu sollte man beim normalen If immer Ausdrücke verwenden.

Viele Leute unterschätzen wie pingelig Windows sein kann - das wiederholte anzeigen von einem Tooltip kann schon genug Verzögerung sein:

Code: Select all

Loop {
	Tooltip test
	Sleep 0 ;um alle Nachrichten zu behandeln
}
#If WinActive("notepad")
t::a
Dies würde alleine durch den im Tooltip eingebauten delay von 15 ms dazu führen, dass Autohotkeys keine Hotkeys mehr erhält.
Und das obwohl das Sleep 0 da ist.
Recommends AHK Studio
gregster
Posts: 8921
Joined: 30 Sep 2013, 06:48

Re: #IfWin[Not]Active

20 Nov 2018, 18:58

nnnik wrote:
20 Nov 2018, 18:25
Dies würde alleine durch den im Tooltip eingebauten delay von 15 ms dazu führen, dass Autohotkeys keine Hotkeys mehr erhält.
Und das obwohl das Sleep 0 da ist.
Ja, nääh, so extrem isses nich. Ich versteh worauf du hinaus willst, aber da muss ich widersprechen. Dieses Beispiel ist fehlerbehaftet.

Der Grund warum dein Hotkey oben nicht funktioniert, liegt darin begründet, dass du da WinActive("notepad") verwendest. Datt kann natürlich nur funktionieren, wenn du ein Fenster aktiv hast, dessen Titel mit der Zeichenkette notepad beginnt (denn Titlematchmode 1 ist default).
Das ist in Notepad allerdings (fast) nie der Fall - abgesehen davon, dass es in der deutschsprachigen Notepadversion Editor heißen würde. Wenn ich stattdessen korrekterweise ahk_class Notepad (mit ahk_class und großem N) verwende, dann klappt es bei mir auch mit dem Hotkey anstandslos und flüssig im Editor (aka Notepad). Ich nehme an, das ist dir durchgerutscht...
User avatar
nnnik
Posts: 4500
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: #IfWin[Not]Active

21 Nov 2018, 02:08

Ich hab das ding nie ausprobiert und es ist allein theoretischer code aber ja doch so extrem ist es und es ist tatsächlich so, dass der delay eines Tolltips ausreicht.
Recommends AHK Studio
User avatar
LuckyJoe
Posts: 335
Joined: 02 Oct 2013, 09:52

Re: #IfWin[Not]Active

21 Nov 2018, 02:44

Danke an alle für eure Unterstützung. Ich habe mich für eine Lösung mit ahk_group entschieden, weil ich damit einfacher und übersichtlicher noch andere Programme einbinden kann, bei denen ich nicht möchte, dass sie bei meiner Tastatur-Routine reagieren.

Bei der Gelegenheit: Kann man eigentlich in einem Script feststellen lassen, ob man sich im aktiven Fenster gerade in einem Modus befindet, wo man Text bearbeiten kann? Konkretes Beispiel: wenn ich bei einer Routine mit F5 einen markierten Text in GROSSBUCHSTABEN umwandeln will, dann soll diese Routine natürlich nur da auf F5 reagieren, wo auch Text verändert werden kann (Texteditor, Eingabefeld, Inputbox usw.). Das soll also nicht von einem einzelnen bestimmten Fenster möglich sein, sondern eben bei allen, wo ich Text editiere; andererseits eben bei keinem, wo ich keinen Text editiere.

HG - Lucky Joe
Herzliche Grüße aus dem Rheinland
Lucky Joe
gregster
Posts: 8921
Joined: 30 Sep 2013, 06:48

Re: #IfWin[Not]Active

21 Nov 2018, 05:12

nnnik wrote:
21 Nov 2018, 02:08
Ich hab das ding nie ausprobiert und es ist allein theoretischer code aber ja doch so extrem ist es und es ist tatsächlich so, dass der delay eines Tolltips ausreicht.
Wie gesagt, ich habe deinen Code ausprobiert (auf einem 7 Jahre alten PC, unter Dreiviertellast) und ich muss (auch aus sonstiger Erfahrung) widersprechen. Mag der Unterschied zwischen Theorie und Praxis sein, der da eine Rolle spielt :shifty:

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: LuckyJoe and 34 guests