条件热键是 AHK 写得干净不干净的分水岭。新手常见问题是:某个热键本来只想在一个窗口生效,结果全局触发;或者写了多个条件后,后面的热键也被意外套进条件里。AHK v1 主要用 #IfWinActive#If,AHK v2 对应常见写法是 #HotIf。你的网站主要以 v1 为主,所以本文以 v1 写法讲清楚。

一、#IfWinActive 限制窗口

#Requires AutoHotkey v1.1
#NoEnv
#SingleInstance Force
SetTitleMatchMode, 2

#IfWinActive ahk_exe notepad.exe
F1::
MsgBox, 只在记事本生效
return
#IfWinActive

最后那个空的 #IfWinActive 很重要,它表示结束条件区域。忘记结束,后面的热键也会继续受这个条件影响。

二、多个窗口分别写清楚

#IfWinActive ahk_exe notepad.exe
F1::MsgBox, 记事本 F1
#IfWinActive

#IfWinActive ahk_exe chrome.exe
F1::MsgBox, Chrome F1
#IfWinActive

同一个热键可以在不同条件下有不同功能。关键是每一段条件都要收尾,不要让作用域混在一起。

三、#If 可以写表达式

如果条件不只是窗口标题,还和变量状态有关,可以用 #If

isEditMode := false
return

F8::
isEditMode := !isEditMode
ToolTip, % isEditMode ? "编辑模式" : "普通模式"
return

#If isEditMode
F1::MsgBox, 只有编辑模式下触发
#If

#If 的条件会在热键触发时判断。表达式别写太复杂,更不要在里面做耗时操作。

四、v2 的 #HotIf 是什么

AHK v2 里常用 #HotIf 表达条件热键,它可以理解为 v2 里更统一的条件热键指令。因为本文主打 v1,这里只做概念提醒,不展开 v2 代码。

; v1 常见写法
#IfWinActive ahk_exe notepad.exe
F2::MsgBox, v1 条件热键
#IfWinActive

; v2 中常见的是 #HotIf,迁移时要注意语法差异。

五、容易乱的地方

  • 忘记用空的 #IfWinActive#If 结束条件。
  • 窗口标题匹配太宽,导致多个窗口都满足条件。
  • 同一个热键在多个条件下定义,自己忘了优先级。
  • #If 表达式里写复杂函数,影响响应速度。
  • 把 v1 的 #IfWinActive 和 v2 的 #HotIf 语法混用。

六、推荐结构

; 全局热键区
^!r::Reload

; 记事本热键区
#IfWinActive ahk_exe notepad.exe
F1::MsgBox, Notepad
#IfWinActive

; Chrome 热键区
#IfWinActive ahk_exe chrome.exe
F1::MsgBox, Chrome
#IfWinActive

; 状态条件热键区
#If isEditMode
F2::MsgBox, Edit mode
#If

条件热键最怕“作用域不清”。每一段条件开头、结尾都写完整,并用注释分区,脚本就不容易乱。

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。