AutoHotkey导致控制键卡住了

10
我有几种情况下控制键会卡住,只有在我运行AutoHotkey时才会出现。这个问题涉及多个不同的修饰键,包括control (^),windows (#)和alt (!)键。
此前已经有类似的问题被多次发帖讨论过: 123。 已经存在一些解决方案,这里提供的一个部分帮助了我(降低了问题的频率),但是控制键仍然偶尔会卡住。我尝试过的解决方法包括#InstallKeybdHook
我的两个问题是:
1. 是否可能预防这个问题? 2. 是否有良好的方式让AutoHotkey监控键是否卡住(例如自动注意到按键被按住了超过10秒),并在发生时立即修复?
我尝试了上述所有建议,并创建了自己的版本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 
}
5个回答

4

除了其他调试方法之外,您可以尝试以下方法:

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

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
    }
}

在关闭消息框后,查看KeyHistory以确定键何时被卡住。


3
我也遇到了这个问题(只有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 按键的按下和松开操作却没有任何按键输入,则通常会激活一个菜单。为了避免此情况发生,键盘或鼠标挂钩可能会自动发送屏蔽键。


2

这是一个在某些情况下有效的解决方案,但在这种情况下不起作用。 - Stenemo

1
虽然user3419297的答案非常好,但我认为blind keyup调用并不是解决问题的方法。
看起来KeyHistory命令导致按键释放。
当我使用user3419297脚本的一个版本而没有KeyHistory时,它从未对我起作用。相比之下,单独调用KeyHistory每次都足以解决我的问题。

1
这个问题突然在一个已经运行多年并且我没有做出任何更改的脚本中出现。值得一提的是,在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键,耶!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接