首页 > 解决方案 > 为什么 Autohotkey 中的“Keywait”会导致打字时两个字母被替换?

问题描述

我有这个脚本:

#IfWinActive Oxford Advanced Learner's Dictionary
$m:: 
KeyWait,m,T0.25 
If (ErrorLevel) 
 {
    Click, 210,563, 10
    sleep,100
    Send, {Down}
    KeyWait,m 
 }
    Else
    {
        Send, m
    }        
return
 $i::
KeyWait, i, T0.25
If (ErrorLevel) {
    Loop 7
        Click, 768,192,3
} else {
    Send, i
}
return

但是当我输入字母mi快速输入“mi”时,它会输入“im”。但是当我键入它们的速度较慢时,不会出现任何问题。为什么会发生这种情况,我该如何解决这个问题?

标签: autohotkey

解决方案


我认为 Threads页面中的这句话与此处相关:

尽管 AutoHotkey 实际上并不使用多个线程,但它模拟了其中的一些行为:如果启动了第二个线程——例如在前一个仍在运行时按下另一个热键——当前线程将被中断(暂时停止)以允许新线程成为当前线程。如果在第二个线程仍在运行时启动了第三个线程,则第二个和第一个线程都将处于休眠状态,依此类推。

当前线程结束后,将恢复最近中断的线程,以此类推,直到所有线程最终结束。

我相信当您在 m 之后快速键入 i 时,当 m keywait 仍在超时范围内时,它会暂停该 keywait 并运行 i。

至于如何解决这个问题,只需在 m 热键中添加“关键”,请注意,这会使它在此完成之前不会运行其他热键,但它会排队:

#IfWinActive Oxford Advanced Learner's Dictionary
$m::
Critical
KeyWait,m,T0.25 
If (ErrorLevel) 
{
    Click, 210,563, 10
    sleep,100
    Send, {Down}
    KeyWait,m 
} else {
    Send, m
}        
return

$i::
KeyWait, i, T0.25
If (ErrorLevel) {
    Loop 7
        Click, 768,192,3
} else {
    Send, i
}
return

推荐阅读