У меня есть скрипт, который содержит три варианта, как эти для 50+ ключей. Интересно, как я мог уменьшить это?
; Press "a" = Option 1 (with 500 ms sleep)
; Press "Ctrl + a" = Option 2 (with 500 ms sleep)
; Press "Ctrl + Alt + a" = Option 1 (with 1000 ms sleep)
a::
    Send, {Enter}
        Sleep, 100
    Send, 1
        Sleep, 500
    Send, {Enter}
Return
^a::
    Send, {Enter}
        Sleep, 100
    Send, 2
        Sleep, 500
    Send, {Enter}
Return
^!a::
    Send, {Enter}
        Sleep, 100
    Send, 1
        Sleep, 1000
    Send, {Enter}
Return
Это работает так, как я хочу, чтобы это работало. Важным является выбранный параметр (1 или 2) и два разных значения Sleep для "Варианта 1". Я бы хотел, чтобы это работало так же, как это.
Я попытался использовать GetKeyState (даже если функция не рекомендуется), но безуспешно. Две проблемы:
- Я не могу нажать Ctrl или Alt перед клавишей "a", в отличие от оригинальной. Поэтому мне пришлось поставить Sleepв начале и нажать модификаторы в первую секунду.
- Это все еще не работало, потому что, если я не заполняю эти переменные нажатием фактических клавиш (Ctrl и / или Alt), это выдает сообщение об ошибке.
Я мог бы найти обходной путь для обоих, но я чувствовал, что это просто не сработает в конце концов. Вот код:
a::
    Sleep, 1000
    GetKeyState, AltState, Alt
    GetKeyState, CtrlState, Ctrl
    Send, {Enter}
    if (CtrlState = D) {
        Send, Option 2
            Sleep, 500
    }
    else {
        Send, Option 1
        if (CtrlState = D and AltState = D) {
            Sleep, 1000
        }
        else {
            Sleep, 500
        }
    }
    Send, {Enter}
Return
После этого я подумал об использовании нескольких команд KeyWait , но я больше не уверен.
TL; DR. Если бы опытный пользователь AHK мог помочь с более короткой, более эффективной альтернативой или решением для варианта GetKeyState (или отладить его), это было бы очень ценно !
Редактировать: Используя подстановочный знак '*' и GetKeyState в качестве функции, код работает лучше, чем оригинал, и содержит меньше повторений, что позволяет мне изменить позже, если это необходимо.
*a::
    Send, {Enter}
    Sleep, 100
    if GetKeyState("Control", "P") and not GetKeyState("Alt", "P") {
        Send, 2
        }
    else {
        Send, 1
        }
    if GetKeyState("Alt", "P") and GetKeyState("Control", "P") {
        Sleep, 1000
        }
    else {
        Sleep, 500
        }
    Send, {Enter}
Return
