AutoHotKey中#If条件内SendInput指令无输出问题排查
问题原因
你的脚本存在3个核心问题:
- 自定义热键默认会拦截按键的原生输入。你定义
t::热键后,系统本该接收到的t字符输入被直接屏蔽,但代码里没有主动发送t,这是t无法输出的首要原因。 - 拦截逻辑完全写反。你的故障是物理按t时,硬件/驱动会自动附带触发间隔极短的y输入,你需要屏蔽的是t按下后短时间内自动冒出来的多余y,而不是拦截t本身、等y触发时再补发t。
- 存在热键递归冲突。你在y热键分支里调用
SendInput t时,脚本模拟发送的t会再次触发你自己定义的t::热键,形成逻辑死锁,最终所有输入都被拦截,没有任何内容输出。你换成MsgBox能正常弹窗,就是因为弹窗不会触发按键热键,所以没有触发死锁。
修正脚本
调整逻辑为:物理按t时正常输出t,同时开启50ms的监控窗口,窗口内出现的y全部直接拦截(这类y都是串键带来的误触发,普通人手动按t再按y的间隔普遍大于100ms,不会被误拦截),窗口到期后自动恢复y的正常输入。
timeout := 50 ; 可根据键盘实际串键情况调整,误拦正常输入就调小,漏拦串键就调大 monitor := false ; 加$前缀让热键仅响应物理按键按下,不响应脚本自身模拟发送的t,避免递归冲突 $t:: { SendInput t ; 主动发送t字符,补上原脚本漏掉的正常t输出 SetTimer, ResetMonitoring, % -timeout monitor := true } return #If monitor ; 监控窗口内的y按键直接拦截,不输出任何内容,吃掉串键带来的多余y y::return #If ResetMonitoring: { monitor := false return }
调优提示
如果使用中发现快速手动按ty组合被误拦截,把timeout的值调小到30即可;如果还是有串键的y漏出来,就把timeout适当调大,直到适配自己的键盘状态。
内容的提问来源于stack exchange,提问作者Ebenezer Isaac
相关产品推荐
相关产品推荐

