Я использую этот код для отправки большего количества прокруток колесика мыши, используя одну метку, проблема в том, что ввод передается снова до завершения цикла, он не учитывается и цикл должен завершиться перед повторным запуском

Я пытался найти способ разбить код, если есть вход и перезапустить его безуспешно

WheelUp::
loop 100
{
sendInput {WheelUp}
sleep 2
}
return

Ожидаемое поведение: в 50-м цикле, если ввод будет повторен, сбросьте счетчик цикла (остановите и перезапустите сценарий), чтобы общее количество повторений составило 150

1
azami88 18 Авг 2019 в 23:32

2 ответа

Лучший ответ

Попробуйте этот подход.
Вы должны изменить настройку #MaxThreadsPerHotkey.

Этот параметр используется для управления количеством «экземпляров» данной горячей клавиши или подпрограммы горячей строки, которые могут существовать одновременно. Например, если горячая клавиша имеет максимум 1 и она нажата снова, когда подпрограмма уже запущена, нажатие будет проигнорировано.

Это позволит горячей клавише «прерывать» себя. Каждый раз, когда вы прокручиваете вверх, когда горячая клавиша уже активна, он добавляет еще 100 прокруток в цикл.

#MaxThreadsPerHotkey 2
WheelUp::

if (counter > 0)  ; this means the hotkey is already active
{
    counter := counter + 100  ; in that case we just add another 100 scrolls to the loop
    return
}
else ; this means the hotkey is not active, we start fresh with 100 scrolls
{   
    counter := 100
}   

while, counter > 0
{
    sendinput, {WheelUp}
    sleep 40  ; change this to your requirement
    counter--
    ; tooltip, % counter   ; un-comment this line for testing

}

return

~WheelDown::counter := 0 ; extra hotkey to stop the loop immediately if needed
1
Yane 20 Авг 2019 в 07:50

Я не могу ответить на другой комментарий, но WheelUp::Send, {WheelUp 100} не прервет текущие 100 разрядов и добавит еще 100 разминок. Таким образом, если ввод был снова введен для 50-го WheelUp, он все равно отправил бы 200 WheelUps.

В цикле вам понадобится условный оператор, чтобы определить, было ли недавно обнаружено физическое прокручивание вверх, а затем перезапустить цикл, если это произойдет. Для большинства ключей вы должны использовать GetKeyState в качестве проверки в операторе if, однако у колеса мыши нет состояния для обнаружения.

В моем примере кода кнопка Enter перезапустит цикл. Я не уверен, как перезапустить цикл, если снова пытаюсь использовать WheelUp, так как нет состояния для обнаружения, и A_TimeSincePriorHotkey ненадежен, потому что цикл отправляет WheelUps.

WheelUp::
loop 100
{
    sendInput {WheelUp}
    sleep 2
    if (GetKeyState("Enter", "P"))
       Goto WheelUp
}
return
0
ilhom 19 Авг 2019 в 17:33