You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过热键在当前运行的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函数动态注册/注销,但需要修改原有热字符串文件的格式:

  1. 先修改你的热字符串文件,把原有的::触发词::替换内容格式改成Hotstring("::触发词::", "替换内容"),比如:
; HotstringsEnglish.ahk 修改后示例
Hotstring("::btw::", "by the way")
Hotstring("::omg::", "oh my god")
  1. 主脚本代码:
; 记录当前已加载的热字符串,用于后续卸载
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 08:14:39