Jak zareagować na utratę / zdobycie okna przez AHK?

0

Gram w Guild Wars 2 i jest funkcja pokazująca nazwy przedmiotów, z którymi można wchodzić w interakcje, ale klawisz należy przytrzymać. Zmieniam go w przełącznik, ale chciałbym, aby działał nawet po zamianie okien w przód iw tył.

Po ponownym przypisaniu funkcji do F3 w grze, przełączanie klucza wydaje się tak proste, jak ten skrypt:

#IfWinActive Guild Wars 2
LAlt::
    if (GetKeyState("F3")) {
        Send, {F3 up}
    } else {
        Send, {F3 down}
    }
#IfWinActive

Jednak gdy okno traci fokus, zakładam, że klawisz jest wciśnięty, ponieważ kiedy odzyskuje fokus, muszę dwukrotnie nacisnąć przełącznik, aby ponownie zaczął pokazywać to, czego chcę.

Idealnie jest, gdy chcę, aby klucz został zwolniony, gdy okno traci fokus i wciśnięty ponownie, gdy okno odzyska fokus. Jak mam to osiągnąć?

KOVIKO
źródło

Odpowiedzi:

0

Możesz sondować stan WinActive w osobnej pętli, a następnie podjąć działania, jeśli aktywne okno się zmieni. Alternatywnie możesz nadal używać osobnej pętli, ale użyj WinWaitNotActive i WinWaitActive, aby podjąć działania w razie potrzeby. Innymi słowy, sprawdzasz, które okno jest aktywne (uzyskujesz aktualnie aktywne okno), a następnie czekasz, aż przestanie być aktywne, zanim zrobisz cokolwiek innego. Gdy nie jest aktywne, ponownie sprawdzasz aktywne okno, zrób coś odpowiedniego, jeśli jest to właściwe okno, a następnie wróć do czekania, aż to okno przestanie być aktywne.

Aby aktywować osobną pętlę tylko wtedy, gdy F3 jest włączony, możesz użyć SetTimer, aby włączyć / wyłączyć powtarzalne wykonywanie oddzielnej procedury, lub po prostu użyć wielokrotnie sprawdzanej zmiennej wspólnej, w której stan zmiennej dzielonej zmienia się w tym samym czasie, gdy wysyłasz F3 w górę lub w dół w opublikowanym kodzie.

JJohnston2
źródło