Auto Hot Key - не может прервать цикл - PullRequest
0 голосов
/ 17 марта 2020

Вот пример сценария автоматической горячей клавиши:

^j::
WinActivate, MyWindow
WinWaitActive, MyWindow

Loop
{
    If GetKeyState("Shift", "P") 
        Break  

    Click, 44, 55
    Sleep, 1000
    Click, 144, 155
    Sleep, 1000
}

return

Все работает нормально, но я не могу прервать l oop нажатием клавиши "Shift". Что не так?

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

Использование al oop внутри определения горячей клавиши - плохая практика.
AHK не обеспечивает истинную многопоточность, поэтому длительные циклы, как правило, действительно плохая идея.
Использование таймера исправляет это, и использование таймера в любом случае всегда то, что вы хотите для чего-то подобного.
И это будет намного проще.

Итак, с Ctrl+j мы активируем желаемое окно и создаем таймер и говорим ему запускать нашу функцию TimerCallback (которую мы вскоре создадим) каждые 2 сек:

^j::
    WinActivate, MyWindow
    WinWaitActive, MyWindow ;shouldn't be needed, but if you find it helpful, fair enough
    TimerCallback() ;run the function once, since the timer is going to
                    ;run it for the first time only after 2secs
    SetTimer, TimerCallback, 2000
return

И затем мы делаем shift горячей клавишей для отключения таймер И мы наверняка хотим использовать модификатор ~ , чтобы не использовать клавишу при нажатии горячей клавиши:
~Shift::SetTimer, koira, Off

А теперь давайте также определим нашу функцию TimerCallback:

TimerCallback()
{
    Click, 44, 55
    Sleep, 1000
    Click, 144, 155
}

Итак, вот снова сценарий полностью, если что-то осталось неясным:

^j::
    WinActivate, MyWindow
    WinWaitActive, MyWindow ;shouldn't be needed, but if you find it helpful, fair enough
    TimerCallback() ;run the function once, since the timer is going to
                    ;run it for the first time only after 2secs
    SetTimer, TimerCallback, 2000
return

~Shift::SetTimer, TimerCallback, Off

TimerCallback()
{
    Click, 44, 55
    Sleep, 1000
    Click, 144, 155
}
2 голосов
/ 17 марта 2020

Удерживайте клавишу Shift нажатой более 2 секунд из-за времени ожидания. Или попробуйте что-то вроде этого:

^j::
Loop
{
    If !WinActive("MyWindow")
    {
        WinActivate, MyWindow
        WinWaitActive, MyWindow
    }
        Click, 44, 55
        Sleep_1000()
        Click, 144, 155
        Sleep_1000()
}
return

Sleep_1000(){
    Loop 10
    {
        Sleep, 100
        If GetKeyState("Shift", "P") 
            exit ; terminate the hotkey's thread
    }
}
...