#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 и не нашел ничего лучше