Автоматический асинхронный цикл горячих клавиш

#loops #asynchronous #autohotkey

#циклы #асинхронный #Автоматическая горячая клавиша

Вопрос:

Это мой код:

 toggle:=0

z::
    if GetKeyState("LButton") {
    toggle:= 0
        Send % "{Click Up}"
    Send % "{w Up}"
    Send % "{Ctrl Up}"
        BlockInput, MouseMoveOff
    } else {
        Send % "{Click Down}"
    Send % "{w Down}"
    Send % "{Ctrl Down}"
        BlockInput, MouseMove
    toggle := 1
    If (toggle := 1) 
            SetTimer, loop, -1 
        }
return

loop:
while (toogle := 1) {
    MouseMove, 50, 0, R
    MouseMove, -50, 0, R
    Sleep, 700 
}
return
  

Он нажимает «щелчок левой кнопкой мыши», «w» и «ctrl»
При повторном нажатии «z» они освобождаются

Цикл должен перемещать мышь каждые 1 секунду немного влево, а затем на столько же вправо

Но это не работает

Если я нажму «z», цикл не остановится

Комментарии:

1. Вы не получаете никакого ключа в своем цикле. Я ошибаюсь?

2. цикл проверяет наличие переменной toogle, и переменная toogle принимает значение false, если я снова нажму z

Ответ №1:

:= (docs) используется для присвоения результата выражения, а не для сравнения значений.
Для сравнения используйте операторы = или == .
Или когда вы просто проверяете значения true / false,
(toggle = 1) совпадает с (toggle) и
(toggle = 0) является таким же, как (!toggle) .

Также вы допустили ошибку toggle в своем цикле while.
Вот исправленный код (он по-прежнему кажется довольно разбитым с точки зрения логики).
Но, возможно, теперь вы можете исправить логику, когда ошибки сценария исчезнут.

 z::
    if (GetKeyState("LButton"))
    {
        toggle := 0
        Send % "{Click Up}"
        Send % "{w Up}"
        Send % "{Ctrl Up}"
        BlockInput, MouseMoveOff
    } 
    else 
    {
        Send % "{Click Down}"
        Send % "{w Down}"
        Send % "{Ctrl Down}"
        BlockInput, MouseMove
        toggle := 1
        
        ;this check will never be false because literally right above you set the value?
        if (toggle) 
            SetTimer, loop, -1 
    }
return

loop:
    while (toggle) 
    {
        MouseMove, 50, 0, R
        MouseMove, -50, 0, R
        Sleep, 700 
    }
return
  

Комментарии:

1. спасибо, я проверю это позже, я скопировал цикл откуда-то еще, потому что я не знаком с ahk и не нашел ничего лучше