Блокировка повторного срабатывания скрипта

Начинающий
Статус
Оффлайн
Регистрация
12 Янв 2022
Сообщения
5
Реакции[?]
0
Поинты[?]
0
Здравствуйте. Нужно, что бы при нажатии sc29 во время работы скрипта, скрипт игнорировал бы это нажатие и дорабатывал бы до конца (сейчас пытается запускать скрипт еще раз и получается каша). Посоветовали ограничивать потоки через #MaxThreadsPerHotkey. Посмотрел примеры, попробовал по разному, эффекта нет никакого. Что я делаю ни так? Может быть можно как то еще решить проблему?

Код:
#MaxThreadsPerHotkey, 2
sc29::
SendInput {W Down}
Sleep 200
SendInput {Shift Down}
SendInput {End Down}
Pause, On
Return

sc29 Up::
Pause, Off
SendInput {End Up}
SendInput {Shift Up}
Sleep 554
SendInput {W Up}
Return
 
1
Пользователь
Статус
Оффлайн
Регистрация
22 Авг 2021
Сообщения
490
Реакции[?]
44
Поинты[?]
8K
Здравствуйте. Нужно, что бы при нажатии sc29 во время работы скрипта, скрипт игнорировал бы это нажатие и дорабатывал бы до конца (сейчас пытается запускать скрипт еще раз и получается каша). Посоветовали ограничивать потоки через #MaxThreadsPerHotkey. Посмотрел примеры, попробовал по разному, эффекта нет никакого. Что я делаю ни так? Может быть можно как то еще решить проблему?

Код:
#MaxThreadsPerHotkey, 2
sc29::
SendInput {W Down}
Sleep 200
SendInput {Shift Down}
SendInput {End Down}
Pause, On
Return

sc29 Up::
Pause, Off
SendInput {End Up}
SendInput {Shift Up}
Sleep 554
SendInput {W Up}
Return
Проблема возникает из-за того, что вы используете Pause в вашем скрипте, но этот оператор может быть применен только для главного потока выполнения скрипта, а не для хоткея. Вам необходимо использовать другой подход для блокировки повторного срабатывания скрипта.

Один из способов решения этой проблемы - это добавить переменную для отслеживания статуса выполнения скрипта. Например, вы можете использовать переменную isRunning, чтобы отслеживать, работает ли скрипт в данный момент.

Попробуйте следующий исправленный код:

Код:
; Устанавливаем переменную для отслеживания статуса выполнения скрипта
isRunning := 0

sc29::
; Проверяем, не запущен ли скрипт уже
if (isRunning = 0) {
    ; Если не запущен, устанавливаем статус выполнения в 1 (запущен)
    isRunning := 1
    
    ; Выполняем действия скрипта
    SendInput {W Down}
    Sleep 200
    SendInput {Shift Down}
    SendInput {End Down}
    
    ; Возвращаем статус выполнения в 0 (не запущен)
    isRunning := 0
}
Return

sc29 Up::
; Пустая часть - этот хоткей не выполняет никаких действий, только блокирует повторное срабатывание
Return
Теперь, если вы нажмете sc29 во время выполнения скрипта, нажатие будет проигнорировано до тех пор, пока скрипт не закончит свою работу. После завершения скрипта, вы снова сможете использовать sc29. (by chatgpt)
 
Начинающий
Статус
Оффлайн
Регистрация
12 Янв 2022
Сообщения
5
Реакции[?]
0
Поинты[?]
0
Проблема возникает из-за того, что вы используете Pause в вашем скрипте, но этот оператор может быть применен только для главного потока выполнения скрипта, а не для хоткея. Вам необходимо использовать другой подход для блокировки повторного срабатывания скрипта.

Один из способов решения этой проблемы - это добавить переменную для отслеживания статуса выполнения скрипта. Например, вы можете использовать переменную isRunning, чтобы отслеживать, работает ли скрипт в данный момент.

Попробуйте следующий исправленный код:

Код:
; Устанавливаем переменную для отслеживания статуса выполнения скрипта
isRunning := 0

sc29::
; Проверяем, не запущен ли скрипт уже
if (isRunning = 0) {
    ; Если не запущен, устанавливаем статус выполнения в 1 (запущен)
    isRunning := 1
   
    ; Выполняем действия скрипта
    SendInput {W Down}
    Sleep 200
    SendInput {Shift Down}
    SendInput {End Down}
   
    ; Возвращаем статус выполнения в 0 (не запущен)
    isRunning := 0
}
Return

sc29 Up::
; Пустая часть - этот хоткей не выполняет никаких действий, только блокирует повторное срабатывание
Return
Теперь, если вы нажмете sc29 во время выполнения скрипта, нажатие будет проигнорировано до тех пор, пока скрипт не закончит свою работу. После завершения скрипта, вы снова сможете использовать sc29. (by chatgpt)
W Shift и End нажимаются, но больше не отжимаются. И нужно как-то прикрутить задержку после отжимания клавиши sc29
SendInput {End Up}
SendInput {Shift Up}
Sleep 554
SendInput {W Up}
 
Сверху Снизу