我想全局禁用一个键,比如说,,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
}
最佳做法是将其放在return
if 语句的外面(在任何热键代码的末尾放置一个返回值),这样它将始终返回,因此如果此代码块在另一个文件和/或其他代码中使用,则执行将不会继续处理热键的例程space::
。
目前,如果在非记事本窗口上按下空格键,任何后续代码仍将执行。
为了纠正这个问题,需要进行如下的细微修改:
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