#HotIf how to? , or WinActive / WaitWinActive? Topic is solved

Stelle Fragen zur Automatisierung von Spielen

Moderator: jNizM

Tobgun1
Posts: 123
Joined: 23 Feb 2023, 07:28

#HotIf how to? , or WinActive / WaitWinActive?

Post by Tobgun1 » 13 Mar 2023, 23:27

Hallo,

Ich bastle seit längerem aus spaß an einem script für ein Spiel
ein simpler Autoclicker der mir die arbeit abnimmt beim weiterdrücken oder wegdrücken von missions bildschirmen oder Loot Sceens am Ende.

ich habe dafür eine ImageSuche erstellt

Code: Select all

ImgScan() {
    CoordMode "Pixel" ; ändert die Art wie die PhotoSuche die coordinaten als referenz nutzt
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Skip.png") ; wenn Photo gefunden wird führe folgende Aktion aus...
            Skip ;UDF-Label für den Befehl "Skip", siehe unten
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Mission Success.png")
            Skip
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Continue.png")
            ContinueAndCompleted
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Mission Completed.png")
            ContinueAndCompleted
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Contracts.png")
            ContractsAndCrack
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Crack Continue.png")
            ContractsAndCrack
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Ready.png") {
            Ready
        }
}
ich würde gerne diese funktion pausieren wenn ich mit alt + Tab zu Discord wechsle

ich habe mehrere #HotIf WinActive("SPACE PUNKS") versucht aber es nicht hinbekommen die funktion dadurch zu pausieren

ich habe über window Spy folgende informationen:

SPACE PUNKS
ahk_class UnrealWindow
ahk_exe SpacePunks-Win64-Shipping.exe
ahk_pid 5300
ahk_id 2294892


welche ist hier #HotIf WinActive("SPACE PUNKS") richtig?

wo gehört es hin?
so? oder gar oben ans script?
Habe bisher kein effeckt einer pausierung wenn ich aus dem Spiel "raus tabbe"

Code: Select all

#HotIf WinActive("SPACE PUNKS")
ImgScan() {
    CoordMode "Pixel" ; ändert die Art wie die PhotoSuche die coordinaten als referenz nutzt
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Skip.png") ; wenn Photo gefunden wird führe folgende Aktion aus...
            Skip ;UDF-Label für den Befehl "Skip", siehe unten
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Mission Success.png")
            Skip
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Continue.png")
            ContinueAndCompleted
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Mission Completed.png")
            ContinueAndCompleted
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Contracts.png")
            ContractsAndCrack
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Crack Continue.png")
            ContractsAndCrack
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Ready.png") {
            Ready
        }
}
oder über der Toggle timer funktion dafür?

Code: Select all

#HotIf WinActive("SPACE PUNKS") ; Teil nur aktiv wenn das Fenster "Space Punks" offen ist
AutoClicker(*) { ; Preset (F8) Hotkey um die Image Suche zu aktivieren
    Static on := False
    If on := !on {
        ComObject("SAPI.SpVoice").Speak("Auto-Klicker Aktiviert") ; Sagt: " Auto-Clicker Aktiviert"
        SetTimer(ImgScan, 1000) ; Startet einen x Sek. wiederholenden Timer für die PhotoSuche
    } Else {
        ComObject("SAPI.SpVoice").Speak("Auto-Klicker Deaktiviert") ; Sagt "Auto-Clicker Deaktiviert"
        SetTimer(ImgScan, 0) ; Stopt den Timer der PhotoSuche (Script Pause-Funktion)
    }
}
#HotIf WinActive("SPACE PUNKS")
oder über und unter beides?
Last edited by Tobgun1 on 14 Mar 2023, 20:29, edited 1 time in total.
Rohwedder
Posts: 7895
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: #HotIf , wann und wie ?  Topic is solved

Post by Rohwedder » 14 Mar 2023, 04:36

Hallo,
siehe: https://ahkde.github.io/docs/v2/lib/_HotIf.htm#howto
Die #HotIf-Direktive bestimmt den Ausdruck, der von nachfolgend erstellten Hotkeys genutzt wird, um festzustellen, ob sie aktiviert werden sollen. Dieser Ausdruck wird ausgewertet, wenn die Taste, die Maustaste oder die Kombination gedrückt wird, oder zu anderen Zeiten, wenn das Programm wissen muss, ob der Hotkey aktiv ist.
Aktiven Threads wie deiner Funktion sind #HotIf-Direktiven völlig egal!

Füge eine oder mehrere WinWaitActive("SPACE PUNKS")-Zeilen jeweils vor den if ImageSearch(&X, &Y,… ein.
Tobgun1
Posts: 123
Joined: 23 Feb 2023, 07:28

Re: #HotIf , wann und wie ?

Post by Tobgun1 » 14 Mar 2023, 06:32

Rohwedder wrote:
14 Mar 2023, 04:36
Hallo,
siehe: https://ahkde.github.io/docs/v2/lib/_HotIf.htm#howto
Die #HotIf-Direktive bestimmt den Ausdruck, der von nachfolgend erstellten Hotkeys genutzt wird, um festzustellen, ob sie aktiviert werden sollen. Dieser Ausdruck wird ausgewertet, wenn die Taste, die Maustaste oder die Kombination gedrückt wird, oder zu anderen Zeiten, wenn das Programm wissen muss, ob der Hotkey aktiv ist.
Aktiven Threads wie deiner Funktion sind #HotIf-Direktiven völlig egal!

Füge eine oder mehrere WinWaitActive("SPACE PUNKS")-Zeilen jeweils vor den if ImageSearch(&X, &Y,… ein.
Hallo und danke für die Antwort , also #HotIf funktioniert dort garnicht?
Winwait active sagt der Funktion sie soll warten bis das Fenster aktiv ist?

Aber dann habe ich wohl HotIf immer noch nicht verstanden. 🙈
Kannst du ein Beispiel aufbauen wo hot if genutzt wird ?
Ich frage mich wo hier regelmäßig mein Verständnis Problem liegt wenn ich die docs auf englisch oder deutsch lese.
Tobgun1
Posts: 123
Joined: 23 Feb 2023, 07:28

Re: #HotIf , wann und wie ?

Post by Tobgun1 » 14 Mar 2023, 06:48

das wäre dann so?

Code: Select all

ImgScan() {
	WinWaitActive("SPACE PUNKS") ; Teil nur aktiv wenn "SpacePunks" geöffnet ist / fenster aktiv ist
    CoordMode "Pixel" ; ändert die Art wie die PhotoSuche die coordinaten als referenz nutzt
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Skip.png") ; wenn Photo gefunden wird führe folgende Aktion aus...
            Skip ;UDF-Label für den Befehl "Skip", siehe unten
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Mission Success.png")
            Skip
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Continue.png")
            ContinueAndCompleted
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Mission Completed.png")
            ContinueAndCompleted
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Contracts.png")
            ContractsAndCrack
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Crack Continue.png")
            ContractsAndCrack
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Ready.png") {
            Ready
        }
}
oder eventuell gar ganz oben an die spitze des scripts um alles nur aktiv zu haben wenn das Spiel aktiv ist?
Rohwedder
Posts: 7895
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: #HotIf , wann und wie ?

Post by Rohwedder » 14 Mar 2023, 09:06

Dein Kommentar in dieser Zeile:

Code: Select all

WinWaitActive("SPACE PUNKS") ; Teil nur aktiv wenn "SpacePunks" geöffnet ist / fenster aktiv ist
ist meines Erachten nicht ganz richtig.
Der Befehl WinWaitActive steuert nicht die Aktivierbarkeit der nachfolgenden Funktion, d.h. einer oder mehrerer Skriptzeilen, sondern:
Sobald das Skript diesen Befehl liest und feststellt, daß das angegebene Fenster nicht aktiv ist, wartet es, bis das Fenster aktiv ist. Während das Skript wartet, ist es nicht imstande, irgendetwas anderes zu tun.

Skriptbeispiele zu #HotIf sind im Handbuch hinreichend vorhanden
https://ahkde.github.io/docs/v2/lib/_HotIf.htm

Wer jedoch https://ahkde.github.io/docs/v2/misc/Threads.htm nicht verstanden hat, hat Autohotkey nicht verstanden!
Tobgun1
Posts: 123
Joined: 23 Feb 2023, 07:28

Re: #HotIf , wann und wie ?

Post by Tobgun1 » 14 Mar 2023, 09:16

Rohwedder wrote:
14 Mar 2023, 09:06
Dein Kommentar in dieser Zeile:

Code: Select all

WinWaitActive("SPACE PUNKS") ; Teil nur aktiv wenn "SpacePunks" geöffnet ist / fenster aktiv ist
ist meines Erachten nicht ganz richtig.
Der Befehl WinWaitActive steuert nicht die Aktivierbarkeit der nachfolgenden Funktion, d.h. einer oder mehrerer Skriptzeilen, sondern:
Sobald das Skript diesen Befehl liest und feststellt, daß das angegebene Fenster nicht aktiv ist, wartet es, bis das Fenster aktiv ist. Während das Skript wartet, ist es nicht imstande, irgendetwas anderes zu tun.

Skriptbeispiele zu #HotIf sind im Handbuch hinreichend vorhanden
https://ahkde.github.io/docs/v2/lib/_HotIf.htm

Wer jedoch https://ahkde.github.io/docs/v2/misc/Threads.htm nicht verstanden hat, hat Autohotkey nicht verstanden!
Achso, ich war noch irritiert mit der hotkey "Deaktivierung " von hot if.

Also brauche ich ein If bei winactive bei der Funktion zur image Suche.

Dann ist die Image Suche nur aktiv wenn das Fenster offen ist?

Oder blockt das immernoch das ganze script?
Rohwedder
Posts: 7895
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: #HotIf , wann und wie ?

Post by Rohwedder » 14 Mar 2023, 09:24

ein If bei winactive bei der Funktion zur image Suche.
klingt gut.
Tobgun1
Posts: 123
Joined: 23 Feb 2023, 07:28

Re: #HotIf , wann und wie ?

Post by Tobgun1 » 14 Mar 2023, 10:07

Rohwedder wrote:
14 Mar 2023, 09:24
ein If bei winactive bei der Funktion zur image Suche.
klingt gut.
Danke 🙏👍
Tobgun1
Posts: 123
Joined: 23 Feb 2023, 07:28

Re: #HotIf , wann und wie ?

Post by Tobgun1 » 14 Mar 2023, 20:30

Rohwedder wrote:
14 Mar 2023, 09:24
ein If bei winactive bei der Funktion zur image Suche.
klingt gut.

Code: Select all

ImgScan() {
        if WinWaitActive("SPACE PUNKS") ; durch "if" und WinWaitActive - Teil nur aktiv wenn "SpacePunks" geöffnet ist / fenster aktiv ist 
            CoordMode "Pixel" ; ändert die Art wie die PhotoSuche die coordinaten als referenz nutzt
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Skip.png") ; wenn Photo gefunden wird führe folgende Aktion aus...
            Skip ;UDF-Label für den Befehl "Skip", siehe unten
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Mission Success.png")
            Skip
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Continue.png")
            ContinueAndCompleted
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Mission Completed.png")
            ContinueAndCompleted
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Contracts.png")
            ContractsAndCrack
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Crack Continue.png")
            ContractsAndCrack
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Auto-Clicker Images\Ready.png") {
            Ready
        WinWaitActive()
        }
sollte nun so stimmen?
Rohwedder
Posts: 7895
Joined: 04 Jun 2014, 08:33
Location: Germany

Re: #HotIf how to? , or WinActive / WaitWinActive?

Post by Rohwedder » 15 Mar 2023, 05:47

Ich fürchte nicht! Insbesondere stört mich dieses WinWaitActive()
Darauf warten, daß ein nicht existierendes Fenster aktiv wird?
(Erinnert mich an "Warten auf Godot" den Inbegriff des absurden Theaters.)
Bei diesem Test

Code: Select all

#Requires AutoHotkey v2.0
q::
{
	SoundBeep 4000, 20 ;kurzer hoher Piep
	WinWaitActive()
	SoundBeep 1000, 20 ;kurzer tiefer Piep
}
bleibt die Ausführung, wie erwartet, genau dort hängen, d.h. es kommt nur der kurze hohe Piep.
Mit "ein If bei winactive bei der Funktion zur image Suche. klingt gut." meinte ich eher sowas:

Code: Select all

IF WinActive("SPACE PUNKS")
	ImgScan()
d.h. die ImgScan()-Funktion sollte nur ausgeführt werden, wenn dieses SPACE PUNKS - Fenster aktiv ist.
Tobgun1
Posts: 123
Joined: 23 Feb 2023, 07:28

Re: #HotIf how to? , or WinActive / WaitWinActive?

Post by Tobgun1 » 15 Mar 2023, 06:47

Rohwedder wrote:
15 Mar 2023, 05:47
Ich fürchte nicht! Insbesondere stört mich dieses WinWaitActive()
Darauf warten, daß ein nicht existierendes Fenster aktiv wird?
(Erinnert mich an "Warten auf Godot" den Inbegriff des absurden Theaters.)
Bei diesem Test

Code: Select all

#Requires AutoHotkey v2.0
q::
{
	SoundBeep 4000, 20 ;kurzer hoher Piep
	WinWaitActive()
	SoundBeep 1000, 20 ;kurzer tiefer Piep
}
bleibt die Ausführung, wie erwartet, genau dort hängen, d.h. es kommt nur der kurze hohe Piep.
Mit "ein If bei winactive bei der Funktion zur image Suche. klingt gut." meinte ich eher sowas:

Code: Select all

IF WinActive("SPACE PUNKS")
	ImgScan()
d.h. die ImgScan()-Funktion sollte nur ausgeführt werden, wenn dieses SPACE PUNKS - Fenster aktiv ist.
Hallo, bin leider auf dem weg zur Arbeit.
Ich habe das ganze kurz vor dem schlafen gehen geändert.

Image search()
if WinActive blabla bla

Und am Ende dachte ich kommt in diesen Block zum ausschalten des WinActive Befehls ein winactive()

Das ist wohl nun einfach nur eine tote Zeile 😅🙈

Auf jedenfall funktioniert es aktuell eigentlich wie erhofft dass es stoppt wenn ich raus tabbe.
Das ist jetzt von mobil kopiert:

Code: Select all

 ImgScan() {
        if WinActive("SPACE PUNKS") { ; Teil nur aktiv wenn "SpacePunks" geöffnet ist / fenster aktiv ist 
            CoordMode "Pixel" ; ändert die Art wie die PhotoSuche die coordinaten als referenz nutzt
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Data\Auto-Clicker Images\Skip.png") ; wenn Photo gefunden wird führe folgende Aktion aus...
            Skip ;UDF-Label für den Befehl "Skip", siehe unten
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Data\Auto-Clicker Images\Mission Success.png")
            Skip
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Data\Auto-Clicker Images\Continue.png")
            ContinueAndCompleted
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Data\Auto-Clicker Images\Mission Completed.png")
            ContinueAndCompleted
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Data\Auto-Clicker Images\Contracts.png")
            ContractsAndCrack
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Data\Auto-Clicker Images\Crack Continue.png")
            ContractsAndCrack
        if ImageSearch(&X, &Y, 0, 0, A_ScreenWidth, A_ScreenHeight, "*50 " A_ScriptDir "\Data\Auto-Clicker Images\Ready.png")
            Ready
        }
}
Hatte alles geklappt wie ich es wollte, also kann per hotkey den Teil aktivieren und er läuft dann wenn ich im Fenster bin , wenn ich raus tabbe dann nicht mehr.

Ob dann einfach nur alles pausiert ist kann ich gerade nicht abschätzen. Die anderen hotkeys nimmt es an wenn ich sie außerhalb des Fensters drücke.

Und das untere winactive() kann raus wenn ich das richtig verstanden habe.
Post Reply

Return to “Spiele”