Autohotkey导致控制键被卡住



我在控制键卡住时会有几种情况,并且只有在我运行自动键时才发生。这发生在多个不同的修饰符键,包括控件(^(,Windows(#(和Alt(!(键。

以前已经发布了几次类似的问题:1,2,,3.存在一些解决方案,此处建议的解决方案部分帮助了我(减少了问题的频率(,但控制键仍然偶尔会卡住。我尝试过的东西包括#installkeybdhook。

我有两个问题:

  1. 有可能防止此问题吗?
  2. 当键卡住时,是否有一种很好的方法来拥有Autohotkey Monitor(例如,自动注意何时持有键的键,并在发生时立即解决此问题?

我尝试了上面建议的所有内容,并创建了我自己的stuckkeyup函数版本(如下所示(:

StuckKeyUp(){
sleep 300 
send {<# up} 
send {># up} 
send {# up} 
send {+ up} 
send {<+ up} 
send {! up} 
send {<! up} 
send {>! up} 
send {^<^^>! up} 
send {^<^>! up} 
send {^ up} 
send {Ctrl down} 
send {Ctrl up}
Send {§ up}         
Send {Shift Up}
Send {LShift Up}
Send {RShift Up}
Send {Alt Up}
Send {LAlt Up}
Send {RAlt Up}
Send {Control Up}
Send {LControl Up}  
Send {<^ down}      
Send {<^ Up}        ; solves some issues, but not all
Send {>^ down}      
Send {>^ Up}        
Send {RControl Up}
Send {LControl Up}
Send {LWin Up}
Send {RWin Up}
sleep 100 
; reload, ; Avoid - Reloading AutoHotkey File causes functions depending on this function to break
return 
}

以及其他调试方法您可以尝试一下:

将此代码放在脚本中的特定位置(在发送控制密钥或计时器中的热键定义中(

If GetKeyState("Ctrl")           ; If the OS believes the key to be in (logical state),
{
    If !GetKeyState("Ctrl","P")  ; but  the user isn't physically holding it down (physical state)
    {
        Send {Blind}{Ctrl Up}
        MsgBox,,, Ctrl released
        KeyHistory
    }
}

查看密钥历史(关闭消息框之后(,其中键卡住了。

我也遇到了这个问题(只有ctrl被卡住了(,对我的解决方案是在脚本的顶部使用#menumaskkey:

;; Avoid Ctrl getting stuck in down state, even when not physically pressed:
#MenuMaskKey vkFF

背景信息来自https://www.autohotkey.com/docs/commands/_menumaskkey.htm

自动发送蒙版键,以防止开始菜单或活动窗口的菜单栏在意外的时间激活。

默认蒙版键是ctrl。

...

如果系统只能检测到win或alt键盘和钥匙,没有中间按键,则通常会激活菜单。为了防止这种情况,键盘或鼠标钩可以自动发送掩码键。

我添加了#installkeybdhook,一切都很好。有关详细信息,请参见下文。

https://www.autohotkey.com/docs/commands/_hotkeymodifiertimeout.htm

而user3419297的答案非常好,我认为blind keyup调用不是解决问题的方法。

看来KeyHistory命令导致键释放。

当我使用KeyHistory的User3419297的脚本版本时,它对我来说从来都不适用。相反,仅调用KeyHistory就足以解决我的问题。

这个问题突然开始出现在一个脚本中,该脚本已经工作了多年,而我没有做出任何更改。FWIW它在Windows更新似乎稍微放慢了AHK和Python脚本后开始,这些脚本将击键发送到应用程序。每个人似乎都说不可能发生,但我知道我看到了什么。无论如何,我尝试了我能找到的所有东西,直到将其放在脚本开始时,我什么也没方法:

^T:: ;Script starts here
    Sleep, 500
    Send {LCtrl Up}
    ;Script continues and Ctrl is no longer pressed :)

对不起,我没有关于为什么有效的精确技术解释。我猜想,当我按下热键(在这种情况下为ctrl-t(时,我没有足够快地放开CTRL键,但是它并没有以某种方式在AHK上注册。无论如何,在发送密钥之前的小停顿似乎每次都起作用。500毫秒是任意的;它有效,我并没有想过要使它更短。每个脚本之后,不再按CTRL,是的!

相关内容

  • 没有找到相关文章

最新更新