为什么 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
但是当我快速键入字母 m 和 i 以键入“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
内的第一行)所以结果是删除额外的字母,这是通过立即按住一个键而产生的,然后它立即执行我为它定义的功能。
那么问题就解决了!
我有这个脚本:
#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
但是当我快速键入字母 m 和 i 以键入“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
内的第一行)所以结果是删除额外的字母,这是通过立即按住一个键而产生的,然后它立即执行我为它定义的功能。
那么问题就解决了!