Тема: AHK: Нажатия кнопок параллельно друг другу с опр. задержками(SetTimer)
Скрипт работает не так как нужно.
ThrottleStateW = 0
ThrottleDelay = 50
SetTimer, Throttle, %ThrottleDelay%
Throttle:
{
GetKeyState, JoyZState, JoyZ
if JoyZState < 35
{
if ThrottleStateW = 0
{
ThrottleStateW = 1
}
SendInput {vk54 down} ; T
LOOP
{
sleep 700
SendInput {vk52 down} ; R
sleep 70
SendInput {vk52 up} ; R
GetKeyState, POVState, JoyPOV
if POVState > 35
break
Return
}
}
else if JoyZState > 35 & < 65
{
if ThrottleStateW = 1
{
SendInput {vk54 Up} ; T
ThrottleStateW = 0
}
}
}
Return
Joy25::
{
}
Return
Этот скрипт написан для джойстика(для игры). Ось определяется в диапазоне 0-100. Но это не суть. Точно так же можно работать с любой другой переменной. Нужно, чтобы когда переменная JoyZState была меньше 35, то кнопка T(vk54) зажималась и не отпускалась до тех пор, пока переменная JoyZState не станет больше 35. И параллельно с этим, когда переменная JoyZState меньше 35, постоянно нажималась кнопка R(vk52) с опр. задержками. Вот как примерно должно выглядеть в блокноте это:
tttttttttrtttttttttrtttttttttrtttttttttrtttttttttrtttttttttr
А вот как это выглядит на практике:
trtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrt
Кнопки просто жмутся поочередно.(тоже самое в игре. Они не зажимаются а нажимаются на долю секунды). Кнопка Т не зажимается, а просто нажимается поочередно с кнопкой R.
Еще нужно сделать так, чтобы даже если во время выполнения sleep переменная JoyZState становилась больше чем 35, то кнопка T переставала быть зажатой и отпускалась. Как я понимаю, командой SetTimer и LOOP этого не сделать т.к. эти команды заканчивают полностью один цикл и только после этого проверяют, запускать ли следующий цикл. А мне нужно, чтобы даже если во время команды sleep я изменил переменную, то кнопка перестала зажиматься.
Еще я заметил, что кнопки мыши как раз работают вроде "как надо". Они зажимаются с определенными промежутками. Но когда выполняется команда sleep, и я в этом время перемещаю джойстик и переменная JoyZState становится больше 35, то кнопка все равно продолжает быть зажатой аж до конца цикла. Вот почему мне нужна замена LOOP и SetTimer.
Я пробовал команды Send, SendInput, SendEvent, SendPlay. Использовал и обычные кнопки и виртуальные коды клавиш. Разницы нет никакой.
Есть ли какая-то команда, которая может постоянно мониторить значение переменной и в любой момент времени прервать выполнение программы?
В каком направлении мне думать, чтобы написать то что я хочу? Я надеюсь, я доходчиво объяснил, чего я хочу. Это сложно объяснить и сложно понять.
Помогите мне, пожалуйста. Я не могу понять, как мне сделать правильно.