同时使用AutoHotkey热键与热字符串:_t输出异常问题求解
解决AutoHotkey热键与热字符串的冲突问题
这个问题其实挺常见的——你的原代码里,t::s是一个普通热键,只要按下t就会立刻触发替换,完全不管你接下来输入什么字符。所以当你输入_t时,t刚被按下就被换成了s,最后就变成了_s,而_t的热字符串根本没机会触发(因为输入流里已经没有_t这两个连续字符了)。
下面给你两种靠谱的解决方案:
方案1:把t的替换改成带单词边界的热字符串
这是最简单的方法,通过热字符串的选项限制t的触发条件,让它只在t是单独字符(或单词边界)时才替换:
:*B0:t::s :*:_t::T
解释一下选项含义:
:*:不需要按空格、回车这类结束键,输入后立即触发替换B0:匹配单词边界,意思是t必须是单独的字符,或者处于单词的开头/结尾(比如前后是空格、标点、行首/行尾)才会触发。这样_t里的t属于连续字符的一部分,就不会触发这个替换,_t的热字符串就能正常工作了。
方案2:给热键t::s添加上下文判断
如果你更习惯用热键而非热字符串,可以给t::s加上条件判断,只有符合“单独输入t”的场景才执行替换:
$t:: ; 判断前一个按键是空白、行首,且没有按下Shift/Ctrl/Alt这类修饰键 if (A_PriorKey = " " || A_PriorKey = "" || A_PriorKey = "`n" || A_PriorKey = "`t") && !GetKeyState("Shift", "P") && !GetKeyState("Ctrl", "P") && !GetKeyState("Alt", "P") { SendInput s } else { ; 不符合条件就直接发送原字符t SendInput t } return :*:_t::T
这里的$前缀很关键,它能防止脚本发送的t再次触发这个热键,避免出现循环替换的问题。
内容的提问来源于stack exchange,提问作者Name
相关产品推荐
相关产品推荐

