1 (изменено: bigden, 2012-01-27 17:48:02)

Тема: 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. Использовал и обычные кнопки и виртуальные коды клавиш. Разницы нет никакой.
Есть ли какая-то команда, которая может постоянно мониторить значение переменной и в любой момент времени прервать выполнение программы?
В каком направлении мне думать, чтобы написать то что я хочу? Я надеюсь, я доходчиво объяснил, чего я хочу. Это сложно объяснить и сложно понять.
Помогите мне, пожалуйста. Я не могу понять, как мне сделать правильно.

2 (изменено: creature.ws, 2012-01-27 21:01:22)

Re: AHK: Нажатия кнопок параллельно друг другу с опр. задержками(SetTimer)

#Persistent
TKeyState = 0
ThrottleDelay = 50

SetTimer, CheckThrottleState, %ThrottleDelay%
Return

CheckThrottleState:
    GetKeyState, JoyZState, JoyZ
    GetKeyState, POVState, JoyPOV
    if (JoyZState < 35) {
        if (TKeyState = 0) {
            Send {vk54 down} ; T
            TKeyState := 1
        }
        If (POVState > 35)
            Return
        SetTimer, SendRKey, -1
        Return 
    }
    Else If (JoyZState < 65 && TKeyState = 1) {
        Send {vk54 Up} ; T
        TKeyState := 0
        Return
    }
Return

SendRKey:
    Send {vk52 down} ; R
    sleep 70
    Send {vk52 up}
    Sleep 700
Return

3

Re: AHK: Нажатия кнопок параллельно друг другу с опр. задержками(SetTimer)

Спасибо. Это почти то, что я хотел. Я забыл убрать JoyPOV из скрипта. Мне нужно работать только с переменной JoyZState. Получилось вот так:

#Persistent
TKeyState = 0
ThrottleDelay = 50
 
SetTimer, CheckThrottleState, %ThrottleDelay%
Return
 
CheckThrottleState:
    GetKeyState, JoyZState, JoyZ

    if (JoyZState < 35) {
        if (TKeyState = 0) {
            Send {vk54 down} ; T
            TKeyState := 1
        }
        If (JoyZState > 35)
            Return
        SetTimer, SendRKey, -1
        Return 
    }
    Else If (JoyZState < 65 && TKeyState = 1) {
        Send {vk54 Up} ; T
        TKeyState := 0
        Return
    }
Return
 
SendRKey:
    Send {vk52 down} ; R
    sleep 70
    Send {vk52 up}
    Sleep 700
Return

Но теперь вместо того, чтобы кнопки тыкались попеременно, теперь тыкается только "Т" вначале, а потом с задержкой тыкается "R".

4

Re: AHK: Нажатия кнопок параллельно друг другу с опр. задержками(SetTimer)

В

If (JoyZState > 35)
Return

Нет необходимости. Более ничем помочь не могу.