9

当我的控制键卡住时,我有几种情况,并且仅在我运行 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 
}
4

5 回答 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(关闭消息框后)在哪些情况下键被卡住。

于 2018-02-28T16:34:25.483 回答
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 按键和按键而没有干预按键,它通常会激活一个菜单。为了防止这种情况,键盘或鼠标挂钩可能会自动发送掩码键。

于 2020-11-04T02:08:04.960 回答
1

虽然 user3419297 的回答非常好,但我认为这个blind keyup电话不能解决问题。

看来该KeyHistory命令会导致键被释放。

当我使用不带 的 user3419297 脚本版本时KeyHistory,它对我没有用。相比之下,KeyHistory每次发生问题时,单独调用就足以解决我的问题。

于 2019-07-13T17:21:11.267 回答
1

这个问题突然出现在一个脚本中,该脚本多年来一直在顺利运行并且我没有对其进行任何更改。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,耶!

于 2021-05-31T18:24:33.317 回答
1

我添加了#InstallKeybdHook,一切都很好。详情见下文。

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

于 2019-08-28T18:05:55.360 回答