Orion9

|
Posted: Sun Sep 27, 2026 13:26 Post subject: |
|
|
| AkulaBig wrote: | | Я уже понял, что невнимательно разобрался с алгоритмом с первого раза |
Да бывает. Я тоже сейчас на трезвую голову посмотрел свой вчерашний алгоритм и увидел в нем косяки. Все-таки видимо два стопарика с утра лишними были.
Более простая и правильная версия функции хука (хотя насколько она правильная еще вопрос)
 Hidden text | Code: | Func KeyboardProc(nCode, wParam, lParam)
Static HC_ACTION = 0
Static hasHintCaps = gHintCaps
Static keyDown = 0, keyUp = 0, isHint = 0, T1, T2
# Передача сообщения следующему хуку
If nCode < HC_ACTION Then
Return DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "wParam", wParam, "Ptr", lParam, "Ptr")
EndIf
# OutputDebugString("nCode: " & nCode & " wParam: " & wParam & " lParam: " & lParam)
Local bitUp, bitRepeat
If auX64 Then
bitUp = lParam > 2147483647 ? 1 : 0
Else
bitUp = BitAND(BitShift(lParam, 31), 1)
EndIf
# bitUp = BitAND(BitShift(lParam,16), 0x8000) = 0x8000 ? 1 : 0
# bitRp = BitAND(BitShift(lParam,16), 0x4000) = 0x4000 ? 1 : 0
# Перехват CTRL
If wParam = 0x11 Then
# OutputDebugString("Repeat Count: " & BitAND(lParam, 0xffff) & " bitRepeat: " & bitRp & " bitUp: " & bitUp)
If Not bitUp Then
keyDown += 1
If auX64 And keyDown > 4 Then # отключение CTRL для ТСх64 через 5 повторов
If hasHintCaps Then
Global gHintCaps = false # флаг подсказки MediaInfo для ТСх64
EndIf
If isHint = 0 Then
ShowHint("CTRL отключен", "", "", 400, 1)
isHint = 1
EndIf
Return 1
EndIf
Else
keyUp += 1
keyDown = 0
isHint = 0
If auX64 And hasHintCaps Then
Global gHintCaps = true
EndIf
If Round(GetUptime() - T1, 0) < 400 Then
Local sPath = GetCurrentPath(ItemAtCursor("panel"))
Local sName = sPath & ItemAtCursor("name")
RunThread("MediaInfoHint", sName)
#MsgBox("Файл под курсором: " & sName)
EndIf
T1 = GetUptime()
EndIf
EndIf
# Передача управления следующему хуку в цепочке
Return DllCall("CallNextHookEx", "Ptr", 0, "Int", nCode, "wParam", wParam, "lParam", lParam, "Ptr")
EndFunc
|
Но все работает лучше. Плюс бонус с миганием подсказки о выключеном котроле при долгом зажатии. Теперь сразу видно, когда он срабатывает. Двойной Ctrl тоже работает лучше: пока не видел больше несрабатываний. Если бы еще мультяшную подсказку доделать со страницами и прочим, вообще был бы шик. Но на это пока у меня времени наверное не будет. |
|