autohotkey 全局禁用某个键但在窗口中启用

autohotkey 全局禁用某个键但在窗口中启用

我想全局禁用一个键,比如说,,space
在特定窗口中启用,例如Notepad

然后我输入下面的几行key.ahk并加载它

space::return

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

space但是当我输入时会出现以下错误Notepad

过去 1109 毫秒内已收到 71 个热键。
要继续吗?
(请参阅帮助文件中的 #MaxHotkeysPerInterval)

似乎导致无限递归。

如果我改变

    space::send {space}

    space::space

然后space输入时什么也不会发生Notepad

问题是,如何才能space全局禁用它,但在其中启用它Notepad

== 编辑 ==

想要禁用该键全球,或者更有用的是,重新映射到另一个键序列。

答案1

您无需担心记事本未激活时该做什么。如果您只有一部分内容涉及记事本未激活时会发生什么活动时,非活动时间默认不执行任何操作。

此代码将禁用Space除记事本之外的所有内容,如您的问题所述:

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

send {Asc 32}行发送空格的 ASCII 代码,这会阻止脚本捕获其自己发送的空格并重新开始。

答案2

接受答案的代码(在撰写本文时列出)在语句内有一个返回if...

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

最佳做法是将其放在returnif 语句的外面(在任何热键代码的末尾放置一个返回值),这样它将始终返回,因此如果此代码块在另一个文件和/或其他代码中使用,则执行将不会继续处理热键的例程space::

目前,如果在非记事本窗口上按下空格键,任何后续代码仍将执行。

为了纠正这个问题,需要进行如下的细微修改:

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

如果return语句在语句之外if,您还可以去掉sendif 语句后面单行的括号:

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

相关内容