Тема: AHK: Фиксим баг ControlGetFocus с залипанием клавиш и двойным кликом
Обратил внимание на зажатие(логическое), время от времени, некоторых клавиш - модификаторов при использовании нек. AHK - скриптов.
Приходилось клацать по "зажатым" клавишам, чтобы их "отжать".
Выяснилось, что повинна в этом поведении команда ControlGetFocus. Сама она клавиши не нажимает, но, каким-то образом, не дает отпускать нажатые(физически). Точнее, если во время работы команды была зажата клавиша-модификатор, есть вероятность, что она залипнет.
Небольшая функция, правящая сей недостаток —
— приводит логическое состояние клавиш к физическому:
ControlGetFixBugUnpressKeys() {
Static ArrayKeys
ArrayKeys:=Object()
ArrayKeys:=["RCtrl", "LCtrl", "LShift", "RShift", "RAlt", "LAlt"]
i:= ArrayKeys.MaxIndex()
Loop %i%
{
Key:=ArrayKeys[A_Index]
GetKeyStatePhys := GetKeyState(Key, "P")
GetKeyStateLogi := GetKeyState(Key)
DiffKeyState := GetKeyStateLogi-GetKeyStatePhys
if DiffKeyState {
Direction := (DiffKeyState=1) ? "Up" : "Down"
SendInput {%Key% %Direction%}
; MsgBox %Key% will be not %Direction%. I fix it.
}
}
}
-----------------------------------------------
UPD: в другой ветке Irbis радикально сократил объем кода:
FixBugUnpressKeys() {
for key, key in ["RCtrl", "LCtrl", "LShift", "RShift", "RAlt", "LAlt"]
if Direction := [0,0,"Up"][2+GetKeyState(Key)-GetKeyState(Key, "P")]
SendInput {%Key% %Direction%}
}
-----------------------------------------------
UPD2: ниже Alectric предложил альтернативу ControlGetFocus с помощью DllCall,
почти? не страдающую этим недостатком,
+ работает двойной клик (известная проблема ControlGetFocus),
- работает на 16мс дольше.
controlgetfocus bug nipped pressed down keys