为什么自动热键中的" 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

但是当我快速键入字母mIfast时;mi";它键入";im";相反但当我打字慢一点时,就不会出现问题。为什么会发生这种情况,以及如何解决此问题?

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

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

当前线程结束时,最近中断的线程将继续,依此类推,直到所有线程最终完成。

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

至于如何解决这个问题,只需在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

我在这里找到了用户的以下代码"Rohwedder";在一个论坛的自动热键网站。

#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〃;在搜索栏上,然后执行我为其定义的功能(单击并向下发送(。所以我的第一个表达式是试图修复之前的代码,正如@Josh在另一个答案中所建议的那样,使用critical。但我也有一些问题!

最后,我使用了上面的代码进行了一些调整:我添加了这个

sleep,50
send,{backspace}

在每个热键下面(在if内的第一行(,因此结果是删除了通过立即按住一个键生成的额外字母,然后它立即执行了我为它定义的功能。

所以问题解决了!

最新更新