为什么 Autohotkey 中的“Keywait”会导致输入时两个字母被替换?

Why " Keywait " in Autohotkey cause two letters be replaced during typing?

我有这个脚本:

#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”。但是当我打字速度变慢时,没有问题发生。为什么会发生这种情况,我该如何解决这个问题?

我认为 Threads page 中的这句话在这里是相关的:

Although AutoHotkey doesn't actually use multiple threads, it simulates some of that behavior: If a second thread is started -- such as by pressing another hotkey while the previous is still running -- the current thread will be interrupted (temporarily halted) to allow the new thread to become current. If a third thread is started while the second is still running, both the second and first will be in a dormant state, and so on.

When the current thread finishes, the one most recently interrupted will be resumed, and so on, until all the threads finally finish.

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

至于如何解决这个问题,只需在 m 热键中添加 Critical,请注意,这样就可以做到这一点,因此在此完成之前,其他热键都不会 运行,但是它会排队向上:

#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

我在 autohotkey 站点的论坛上找到了用户“Rohwedder”的以下代码here

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

它对我来说非常有效,但我通过以这种方式编写 keywait 来实现,例如,当我按住 m 几秒钟时,与我的问题中的脚本不同它首先在搜索栏上输入“m”,然后执行我为它定义的功能(单击并向下发送)。所以我的第一个表达式是尝试使用 critical 修复以前的代码,正如@Josh 在其他答案中所建议的那样。但我也遇到了一些问题!

最后我通过一点调整使用了上面的代码:我添加了这个

   sleep,50
   send,{backspace}

在每个热键下方(在 if 内的第一行)所以结果是删除额外的字母,这是通过立即按住一个键而产生的,然后它立即执行我为它定义的功能。

那么问题就解决了!