Jak uprościć ten skrypt AHK? GetKeyState lub KeyWait?

0

Mam skrypt zawierający trzy takie warianty dla kluczy 50+. Ciekawe, jak mógłbym to zmniejszyć?

; Press "a" = Option 1 (with 500 ms sleep)
; Press "Ctrl + a" = Option 2 (with 500 ms sleep)
; Press "Ctrl + Alt + a" = Option 1 (with 1000 ms sleep)

a::
    Send, {Enter}
        Sleep, 100
    Send, 1
        Sleep, 500
    Send, {Enter}
Return

^a::
    Send, {Enter}
        Sleep, 100
    Send, 2
        Sleep, 500
    Send, {Enter}
Return

^!a::
    Send, {Enter}
        Sleep, 100
    Send, 1
        Sleep, 1000
    Send, {Enter}
Return

To działa tak, jak chcę, żeby to działało. Ważna jest wybrana opcja (1 lub 2) i dwie różne Sleep wartości dla „Opcja 1”. Chciałbym, żeby tak działało.

Próbowałem użyć GetKeyState (nawet jeśli funkcja jest zalecana, a nie ta) bez powodzenia. Dwa problemy:

  1. Nie mogę nacisnąć klawisza Ctrl ani Alt przed klawiszem „a”, inaczej niż w oryginalnym. Więc musiałem umieścić Sleep na początku i naciśnij modyfikatory w pierwszej sekundzie.
  2. Nadal jednak nie zadziałało, ponieważ jeśli nie wypełnię tych zmiennych naciskając właściwe klawisze (Ctrl i / lub Alt), pojawi się komunikat o błędzie.

Mogłem znaleźć obejście dla obu, ale czułem, że po prostu nie będzie działać. Oto kod:

a::
    Sleep, 1000
    GetKeyState, AltState, Alt
    GetKeyState, CtrlState, Ctrl
    Send, {Enter}
    if (CtrlState = D) {
        Send, Option 2
            Sleep, 500
    }
    else {
        Send, Option 1
        if (CtrlState = D and AltState = D) {
            Sleep, 1000
        }
        else {
            Sleep, 500
        }
    }
    Send, {Enter}
Return

Po tym niepowodzeniu pomyślałem o użyciu wielu KeyWait polecenia, ale już nie jestem pewien.

TL; DR. Jeśli doświadczony użytkownik AHK może pomóc w krótszej, bardziej wydajnej alternatywie lub rozwiązaniu dla GetKeyState wariant (lub debuguj go), byłoby bardzo mile widziane!


Edytować : Używając symbolu wieloznacznego „*” i funkcji GetKeyState jako funkcji, kod działa lepiej niż oryginał i zawiera mniej powtórzeń, co ułatwia mi późniejszą modyfikację, jeśli zajdzie taka potrzeba.

*a::
    Send, {Enter}
    Sleep, 100
    if GetKeyState("Control", "P") and not GetKeyState("Alt", "P") {
        Send, 2
        }
    else {
        Send, 1
        }
    if GetKeyState("Alt", "P") and GetKeyState("Control", "P") {
        Sleep, 1000
        }
    else {
        Sleep, 500
        }
    Send, {Enter}
Return
deviance
źródło

Odpowiedzi:

1

Nie jestem pewien, jaki problem rzeczywiście próbujesz rozwiązać. Próbujesz połączyć pierwszy skrypt w bardziej wydajny kod? Czy też pierwszy skrypt nie działa w jakiś sposób?

Możesz użyć modyfikatora gwiazdy ('*') przed skrótem klawiszowym, aby zezwolić na wyzwalanie z już wciśniętymi modyfikatorami (a wtedy będziesz musiał odpowiednio obsługiwać te modyfikatory, jeśli ich tam nie ma, co częściowo robi twój przykładowy kod) . Uważam, że dotyczy to pierwszego przedmiotu wymienionego jako problem.

to znaczy.,

*a::

To się uruchomi a, #a, +a, ^a, !a, ^!aitd.

Możesz także zadzwonić GetKeyState() bez przypisywania zmiennych stanu pośredniego i sprawdzania, czy wciśnięto modyfikatory.

If GetKeyState("Control", "P") && GetKeyState("Alt", "P") {
}
JJohnston2
źródło
Pierwszy wklejony kod działa idealnie. Nie mam z tym problemu, bardziej jakby to była preferencja, aby trzy klawisze skrótu zostały połączone w jeden. Jeśli chodzi o twoją odpowiedź, symbol wieloznaczny może rozwiązać moje problemy, nie wiedziałem o tym. Z łączącą się częścią myślę teraz o podprogramach, ale najpierw spróbuję ponownie użyć metody GetKeyState, używając tej funkcji.
deviance