[英]AutoHotkey causing control key to get stuck
当我的控制键被卡住时,我有几种情况,只有当我运行 AutoHotkey 时才会发生。 这发生在多个不同的修饰键上,包括控制 (^)、窗口 (#) 和 alt (.) 键。
类似的问题之前发过 几次: 1、2、3 。 存在一些解决方案, 这里建议的解决方案部分帮助了我(降低了问题的频率),但控制键仍然偶尔会卡住。 我尝试过的事情包括#InstallKeybdHook 。
我有两个问题:
我已经尝试了上面建议的所有方法,并创建了我自己的 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
}
}
并查看 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 键按下和键弹起而没有中间按键,它通常会激活一个菜单。 为了防止这种情况,键盘或鼠标钩子可能会自动发送屏蔽键。
虽然 user3419297 的回答非常好,但我认为blind keyup
调用并不能解决问题。
似乎是KeyHistory
命令导致密钥被释放。
当我使用不带KeyHistory
的 user3419297 脚本版本时,它对我不起作用。 相比之下,每次发生问题时,单独调用KeyHistory
就足以为我解决问题。
我添加了#InstallKeybdHook,一切都很好。 详情见下文。
https://www.autohotkey.com/docs/commands/_HotkeyModifierTimeout.htm
这个问题突然开始出现在一个脚本中,这个脚本多年来一直没有任何问题,我也没有对其进行任何更改。 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,耶!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.