条件热键是 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
条件热键最怕“作用域不清”。每一段条件开头、结尾都写完整,并用注释分区,脚本就不容易乱。
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。

评论(0)