繁体   English   中英

AutoHotkey 导致控制键卡住

[英]AutoHotkey causing control key to get stuck

当我的控制键被卡住时,我有几种情况,只有当我运行 AutoHotkey 时才会发生。 这发生在多个不同的修饰键上,包括控制 (^)、窗口 (#) 和 alt (.) 键。

类似的问题之前几次1、2、3 存在一些解决方案, 这里建议的解决方案部分帮助了我(降低了问题的频率),但控制键仍然偶尔会卡住。 我尝试过的事情包括#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 
}

在其他调试方法中,您可以试试这个:

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM