2

Я хочу отключить ключ глобально, скажем это, пробел,
но включить в конкретном окне, например, Notepad .

Затем я помещаю ниже строки в key.ahk и загружаю его

space::return

#IfWinActive ahk_class Notepad
    space::send {space}
#IfWinActive

Но ниже ошибка возникает, когда я набираю пробел в Notepad:

71 горячая клавиша была получена за последние 1109 мс.
Вы хотите продолжить?
(см. #MaxHotkeysPerInterval в файле справки)

кажется результатом бесконечной рекурсии.

Если я изменю

    space::send {space}

в

    space::space

Тогда ничего не происходит, когда пробел набран в Notepad .

Вопрос в том, как я могу отключить пространство глобально, но включить его в Notepad?

== РЕДАКТИРОВАТЬ ==

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

2 ответа2

2

Вам не нужно беспокоиться о том, что делать, когда Блокнот не активен. Если у вас есть только часть , которая имеет дело с тем, что происходит , когда Notepad активен, то неактивные раз не будет просто ничего не делать по умолчанию.

Этот код отключит пробел во всем, кроме Блокнота, как описано в вашем вопросе:

space::
    if WinActive("ahk_class Notepad") 
    {
        send {Asc 32}
        return
    }

Строка send {Asc 32} отправляет код ASCII для пробела, который не позволяет сценарию перехватить свое собственное отправленное пространство и начать заново.

1

Код для принятого ответа (как он указан на момент написания этой статьи) имеет возврат внутри оператора if ...

space::
    if WinActive("ahk_class Notepad") 
    {
        send {Asc 32}
        return
    }

Лучшей практикой будет поместить return за пределы оператора if (поместить возврат в конец любого кода горячей клавиши), чтобы он всегда возвращался, поэтому, если этот блок кода используется в другом файле и / или с другим кодом, выполнение не будет продолжать после процедуры, которая обрабатывает space:: hotkey.

В настоящее время любой последующий код будет по-прежнему выполняться, если в окне, отличном от блокнота, нажать пробел.

Небольшая модификация для исправления этого будет выглядеть следующим образом:

space::
    if WinActive("ahk_class Notepad") 
    {
        send {Asc 32}
    }
return

Если оператор return находится за пределами оператора if , вы также можете избавиться от скобок для отдельной строки send после оператора if:

space::
    if WinActive("ahk_class Notepad") 
        send {Asc 32}
return

Еще одним небольшим изменением было бы просто вернуться, если Блокнот не активен. Это может быть полезно в тех случаях, когда есть следующий код (а не просто один оператор send ), в основном потому, что его легче читать и понимать ...

space::
    if !WinActive("ahk_class Notepad") 
        return   ; execution will end here unless Notepad is active

    send {Asc 32}

    ...

    ...

    ; lots of other code can be added here 
    ; without encompassing it in an if {} block

    ...

    ...

return   ; make sure nothing following this will execute

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