I have several situations when my control key gets stuck, and it happens only when I have AutoHotkey running. This happens with multiple different modifier keys including the control (^), windows (#), and alt (!) keys.
Similar problems have been posted several times before: 1, 2, 3. Some solutions exists, and the one suggested here partially helped me (decreased the frequency of the problem), but the control key still gets stuck occasionally. Things I have tried include #InstallKeybdHook.
I have two questions:
I have tried everything suggested above, and created my own version of a StuckKeyUp function (as suggested here):
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
}
Among other debugging methods you can try this:
Put this code at specific positions in your script (within hotkey definitions that send the control key or in a timer)
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
}
}
and look in the KeyHistory (after closing the message box) in which situations the key gets stuck.
I also had this problem (with only Ctrl ever getting stuck), and the fix for me was to use #MenuMaskKey at the top of the script:
;; Avoid Ctrl getting stuck in down state, even when not physically pressed:
#MenuMaskKey vkFF
Background info from https://www.autohotkey.com/docs/commands/_MenuMaskKey.htm
The mask key is sent automatically to prevent the Start menu or the active window's menu bar from activating at unexpected times.
The default mask key is Ctrl.
...
If the system was to detect only a Win or Alt keydown and keyup with no intervening keypress, it would usually activate a menu. To prevent this, the keyboard or mouse hook may automatically send the mask key.
While user3419297's answer is very good, I think the blind keyup
call is not what fixes the problem.
It appears that the KeyHistory
command causes the keys to be released.
When I used a version of user3419297's script without KeyHistory
, it never worked for me. In contrast, invoking KeyHistory
alone has been sufficient to resolve the problem for me every time it has occured.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With