AHK2中怎么使某个快捷键在某个程序中不生效?

比如我平常是屏蔽F1按键的,在Edge浏览器、Excel里等怕误按
但是打Dota时又需要用到F1
AHK2不能用#IfWinNotActive了,我尝试用下面这段代码,但发现根本不是我想要的效果

if WinActive(“ahk_exe dota2.exe”) {
}
else {
F1:: return
}

你应该看看V2文档。这是基础且浅显的规则,很容易找到。

1 个赞

这不是有嘛,hotifwinnotactive

看了示例也不明白,咋就不对呢?

HotIfWinNotActive “ahk_exe dota2.exe”
Hotkey “F1”, “Off”

image

image

看了,没明白啊 :sweat_smile:感觉一点也不浅显易懂

#HotIf !WinActive("ahk_exe dota2.exe")
f1:: return
#HotIf
2 个赞

额,禁用热键的前提是你在脚本里设置了这个热键。

你应该这么写:

HotIfWinNotActive "ahk_exe dota2.exe"
Hotkey "f1", MyFuncFordota2else

MyFuncFordota2else(){
;屁都不用干
}

仔细看了下,还是楼上写法ok,用HotIfWinNotActive的话是个动态热键,你还的再写一段HotIfWinActive “ahk_exe dota2.exe” 来禁用热键。

2 个赞

按照楼主的需求,
应当是在DOTA里面禁用F1,
所以 WinActive 的前面不需要感叹号 ! :

#HotIf WinActive("ahk_exe dota2.exe")
F1:: return
#HotIf

另外,建议楼主 先阅读一下 AutoHotkey 帮助的“常见问题”,
很多常见问题都可以在这里面找到答案:

1 个赞

反了 :rofl:恰恰是在dota里需要使用F1
感觉AHK的文档和语法好奇怪啊,比如说看你们的代码最后面还有个#HotIf,在@dog 给的文档里就没有这样用

HotIf 允许在脚本运行时创建和修改上下文相关的热键(相比之下, #HotIf 指令是位置性的, 在脚本开始执行前生效). (via

#HotIf 必须放在代码顶层。

搞出这么多来一部分原因是兼容旧习惯。

也可以用判断语句调用 Hotkey 函数来动态设定/取消热键。

我推荐使用 #HotIf,只要这个热键是在脚本运行期间就存在的,用它就蛮合理。后面的条件是动态计算的,即每一次都重新计算后面条件的值:

创建的热键将使用该表达式来确定是否应激活它们. 当按下键, 鼠标按钮或组合键, 或者在程序需要知道热键是否处于活动状态时, 将对该表达式求值.(via

3 个赞