如何通过热键在当前运行的AHK脚本中切换包含/排除指定的热字符串脚本
如何通过热键在当前运行的AHK脚本中切换包含/排除指定的热字符串脚本
我来帮你解决这个问题!你之前的方法行不通,核心原因是 #Include 是AHK的预处理器指令——它在脚本开始运行之前就会被处理,根本没法在运行时(比如按下热键的时候)动态执行。所以你按^e的时候看似生效,其实只是脚本启动时可能已经加载了内容,而^f的#Include完全没起作用。
方案一:用条件变量控制热字符串生效(推荐,简单可靠)
思路是:把两组热字符串都提前加载,然后用一个变量标记当前激活的语言,通过#If条件来控制只有对应语言的热字符串能触发。
; 初始化当前语言为英文 CurrentActiveLang := "English" ; 定义切换热键(仅在Anki窗口激活时生效) #If WinActive("Browse ahk_exe anki.exe") ^e:: CurrentActiveLang := "English" ToolTip, 已切换为英文热字符串 SetTimer, ToolTip, -1500 ; 1.5秒后自动关闭提示 return ^f:: CurrentActiveLang := "French" ToolTip, 已切换为法文热字符串 SetTimer, ToolTip, -1500 return #If ; 用#If条件控制两组热字符串的生效范围 #If WinActive("Browse ahk_exe anki.exe") && CurrentActiveLang = "English" #Include HotstringsEnglish.ahk #If WinActive("Browse ahk_exe anki.exe") && CurrentActiveLang = "French" #Include HotStringsFrench.ahk #If
这个方案的优势:
- 不需要修改你现有的热字符串文件,直接复用原内容
- 切换逻辑简单,只需要改变变量值就能立即生效
- 即使两组热字符串有相同的触发词,也不会冲突——因为
#If条件互斥,同一时间只有一组会被触发
方案二:动态加载/卸载热字符串(适合需释放资源的场景)
如果你需要完全卸载前一组热字符串(而非用条件屏蔽),可以用Hotstring函数动态注册/注销,但需要修改原有热字符串文件的格式:
- 先修改你的热字符串文件,把原有的
::触发词::替换内容格式改成Hotstring("::触发词::", "替换内容"),比如:
; HotstringsEnglish.ahk 修改后示例 Hotstring("::btw::", "by the way") Hotstring("::omg::", "oh my god")
- 主脚本代码:
; 记录当前已加载的热字符串,用于后续卸载 LoadedHotstrings := [] #If WinActive("Browse ahk_exe anki.exe") ^e:: UnloadHotstrings() ; 先卸载之前的热字符串 LoadHotstrings("HotstringsEnglish.ahk") ToolTip, 已加载英文热字符串 SetTimer, ToolTip, -1500 return ^f:: UnloadHotstrings() LoadHotstrings("HotStringsFrench.ahk") ToolTip, 已加载法文热字符串 SetTimer, ToolTip, -1500 return #If ; 加载热字符串的辅助函数 LoadHotstrings(filePath) { global LoadedHotstrings FileRead, content, %filePath% ; 提取所有热字符串触发词,用于后续卸载 RegExMatch(content, "O)(::.+?::)", matches) for match in matches { LoadedHotstrings.Push(match.Value) } ; 执行热字符串注册代码 %content% } ; 卸载热字符串的辅助函数 UnloadHotstrings() { global LoadedHotstrings for hs in LoadedHotstrings { Hotstring(hs, "") ; 注销热字符串 } LoadedHotstrings := [] ; 清空记录列表 }
这个方案适合需要完全释放热字符串资源的场景,但需要修改原有文件,相对繁琐一些。
备注:内容来源于stack exchange,提问作者yfjuu 6
相关产品推荐
相关产品推荐

