Orion9

|
Posted: Sun Sep 27, 2026 14:06 Post subject: |
|
|
| Orion9 wrote: | | CTRL работает только в 32-битной версии ТС из-за ограничений самого ТС. |
Небольшая доработка, позволяющая обойти это ограничение. Применение кода (можно добавить в любой модуль) включает также двойной CTRL, который работает не только в ТСх64.
 Hidden text | Code: | RunThread("KeyboardHook")
Func KeyboardHook()
Local hHook
Local WH_KEYBOARD = 2
Local gKeyboard = Callback("KeyboardProc", "int;wparam;lparam")
Local processID = 0
Local mainThreadID = DllCall("user32\GetWindowThreadProcessId", "Ptr", AUTORUN_TCHANDLE, "UInt*", @processID, "UInt")
Local hAutoWdx = DllCall("GetModuleHandleW", "Wstr", ("Autorun.wdx" & (auX64 ? "64" : "")), "handle")
hHook = DllCall("SetWindowsHookEx", _
"Int", WH_KEYBOARD, _
"Ptr", gKeyboard.Ptr, "Ptr", hAutoWdx, "UInt", mainThreadID, "Ptr")
OutputDebugString("WH_KEYBOARD: " & SYSERROR & " " & SYSERRORTEXT)
Local buf = Buffer(auX64 ? 56 : 28)
While 1
DllCall("GetMessage", "ptr", buf.ptr, "hwnd", -1, "uint", 0, "uint", 0)
DllCall("TranslateMessage", "ptr", buf.ptr)
DllCall("DispatchMessage", "ptr", buf.ptr)
Wend
Free(buf)
EndFunc
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
Func MediaInfoHint(Filename)
Local hWin = MediaInfoTip(Filename)
# удаление подсказки тотала
Local hTip = WinFind(0, "TToolTip")
If hTip > 0 Then SendMessage(hTip, 0x0010, 0, 0)
Local buf = Buffer(auX64 ? 56 : 28)
While 1
DllCall("GetMessage", "ptr", buf.ptr, "hwnd", hWin, "uint", 0, "uint", 0)
DllCall("TranslateMessage", "ptr", buf.ptr)
DllCall("DispatchMessage", "ptr", buf.ptr)
Wend
Free(buf)
EndFunc
Func MediaInfoTip(sFile)
If Not FileExist(sFile) Then
ShowHint("Файл не существует " & sFile)
Return
Endif
If StrPos(FileGetAttr(sFile), "D") Then
ShowHint("Каталог " & sFile)
Return
Endif
Static sLib = auX64 ? gMediaInfoX64 : gMediaInfoX32
Static hLib = DllCall("LoadLibrary", "wstr", sLib, "ptr")
If hLib = 0 Then
ShowHint("Error LoadLibrary " & sLib)
Return
EndIf
Static sPath = FileGetDir(sLib)
Static sLang ="file://" & sPath & "\ru.csv"
Static pNew = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_New", "Ptr")
Static pOpen = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Open", "Ptr")
Static pGet = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Get", "Ptr")
Static pDel = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Delete", "Ptr")
Static pOpt = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Option", "Ptr")
Static pInfo = DllCall("GetProcAddress", "Ptr", hLib, "Str", "MediaInfo_Inform", "Ptr")
Local hMI = DllCall(pNew, "Ptr")
If hMI = 0 Then
ShowHint("MediaInfo.dll couldn't create new object")
Return
Endif
If DllCall(pOpen, 'ptr', hMI, "wstr", sFile, "uint") <> 1 Then
DllCall(pDel, "Ptr", hMI)
Return ShowHint("MediaInfo.dll couldn't open file " & sFile)
EndIf
Local sMI
DllCall(pOpt, "Ptr", hMI, "Wstr", "Complete", "Wstr", "0", "Wstr")
DllCall(pOpt, 'Ptr', hMI, "Wstr", "Language", "Wstr", sLang, "Wstr")
DllCall(pOpt, "Ptr", hMI, "Wstr", "Output", "Wstr", "Inform", "Wstr")
Local lst = List()
lst.Text = DllCall(pInfo, "Ptr", hMI, "Uint", 0, "Wstr")
For line in lst
sMI &= FixSpaces(line) & auCRLF
Next
Free(lst)
DllCall(pDel, "Ptr", hMI)
If gDurationBaloon Then
gBTip = CreateBaloonTip("MediaInfo", 1, 300)
If gBTip = 0 Then Return MsgBox("Не удалось создать окно подсказки BaloonTip")
EndIf
If StrTrim(sMI) = "" Then sMI = "нет данных"
ShowMediaHint(sMI)
Return gBTip
EndFunc
|
Двойной CTRL над файлом под указателем вызывает мультяшную подсказку MediaInfo. Подсказка продолжает висеть, пока не будет закрыта (можно двойным кликом по ней), что может быть удобно если нужно сравнить данные двух или более файлов.
 Скрин |
|