У меня есть скрипт, который содержит три варианта, как эти для 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 (даже если функция не рекомендуется), но безуспешно. Две проблемы:

  1. Я не могу нажать Ctrl или Alt перед клавишей "a", в отличие от оригинальной. Поэтому мне пришлось поставить Sleep в начале и нажать модификаторы в первую секунду.
  2. Это все еще не работало, потому что, если я не заполняю эти переменные нажатием фактических клавиш (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

1 ответ1

1

Мне неясно, какую проблему вы на самом деле пытаетесь решить. Вы просто пытаетесь объединить первый скрипт в более эффективный код? Или первый скрипт не работает так, как вы хотели бы?

Вы можете использовать звездочку ('*') перед горячей клавишей, чтобы позволить ей срабатывать с уже нажатыми модификаторами (и тогда вам придется обрабатывать их соответствующим образом, если их там нет, что частично делает ваш пример кода) , Я считаю, что это касается первого пункта, который вы указали в качестве проблемы.

т.е.

*a::

Это сработает на a , #a , +a , ^a !a , ^!a т. д.

Вы также можете вызвать GetKeyState() не назначая промежуточные переменные состояния, и проверить, нажимаются ли модификаторы.

If GetKeyState("Control", "P") && GetKeyState("Alt", "P") {
}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .