Orion9

|
Posted: Tue Nov 11, 2025 20:39 Post subject: |
|
|
Как-то я увлёкся описанием MediaHint, что совсем забыл про функции Duration и MediaInfoTest. Кнопка на Duration теперь выглядит так:
 Hidden text TOTALCMD#BAR#DATA
71000
%COMMANDER_PATH%\Icons\MediaInfo.ico
Подсчёт времени воспроизведения|Alt - Использовать TCMediaInfo.wdx|Ctrl - Глубина каталога = 1|Shift - Отключить фильтр расширений
-1
CapsLock больше нет. Shift позволяет отключить фильтр расширений, указанных в заголовке модуля. По умолчанию фильтр включен, т.к. он ускоряет операцию подсчета, поскольку MediaInfo не приходится открывать каждый файл в каталоге. Но бывают случаи, когда нужно обработать все файлы. Если файл не содержит сведений о времени воспроизведения, в лог заносится "Empty".
Иногда при отключенном фильтре текстовые файлы субтитров могут возвращать информацию о времени воспроизведения. Не уверен, что это правильно, хотя это, видимо, кому-то требуется. В режиме MediaInfo.dll такие файлы в расчет не принимаются, в лог записывается "Warning". Но если по какой-то причине нужно посчитать длительность таких файлов, можно использовать режим плагина TCMediaInfo.wdx через запуск с Alt.
Лог сохраняется во временный каталог, но только при его открытии, во время следующей сессии он перезаписывается.
Кнопка MediaInfoTest только для теста, но может выводить информацию в режиме "Inform".
 Hidden text TOTALCMD#BAR#DATA
71010
%COMMANDER_PATH%\Icons\MediaInfo.ico
MediaInfoTest|Ctrl - Inform
1
-1
Если нужно сделать подсказку с выборочными полями из MediaInfo.dll, можно использовать эту кнопку как заготовку.
Подсказку в стиле BaloonTip можно использовать в других целях, но без внесения изменений не обойтись. Отдельная кнопка для теста кода и его адаптации, если кому-то вдруг потребуется:
 Hidden text TOTALCMD#BAR#DATA
60031
%COMMANDER_EXE%
Baloon ToolTip
-1
 Hidden text | Code: | RegisterCommand 60031 TestToolTip
Global gTTipWndProc, aTTipWnd = List()
Global gTTipWP = Callback("TTipWndProc", "hwnd;uint;wparam;lparam")
Func TestToolTip()
Static WM_SETFONT = 0x30, _
TTM_TRACKACTIVATE = 1041, _
TTM_TRACKPOSITION = 1042, _
TTM_SETTIPBKCOLOR = 1043, _
TTM_SETTIPTEXTCOLOR = 1044, _
TTM_SETMAXTIPWIDTH = 1048, _
TTM_SETMARGIN = 1050, _
TTM_SETTITLE = 1057, _
TTM_ADDTOOL = 1074, _
TTM_UPDATETIPTEXT = 1081
Local hTip = DllCall("CreateWindowExW", _
"dword", 8, _
"wstr", "tooltips_class32", _
"wstr", "", _
"dword", 0x00000c0, _
"int", 0, "int", 0, "int", 0, "int", 0, _
"handle", AUTORUN_TCHANDLE, _
"handle", 0, "handle", 0, "ptr", 0, "handle")
If hTip = 0 Then Return
Global gTX, gTY
MouseGetPos("gTX","gTY")
aTTipWnd.Add(hTip)
gTTipWndProc = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
"hwnd", hTip, "int", -4, "long_ptr", gTTipWP.Ptr, "ptr")
Local sTitle = "Title"
Local sText = "Buffer text"
Local txt = Buffer(255)
txt.Zero()
txt.SetStr(sTitle & Chr(0))
Local hIco = SendMessage(AUTORUN_TCHANDLE, 0x7f, 2, 0)
SendMessage(hTip, TTM_SETTITLE, (IsPressed(0x11) ? hIco : 1), txt.ptr)
txt.Zero()
txt.SetStr(sText & Chr(0))
Local buf = Buffer(auX64 ? 56 : 40) # TTTOOLINFOW
buf.Zero()
If auX64 Then
buf.SetNum(0, "uint", buf.size, _
"uint", 0x00a0, _
"hwnd", 0, _
"uint_ptr", 0)
buf.SetNum(48, "ptr", txt.ptr)
Else
buf.SetNum(0, "uint", buf.size, _
"uint", 0x00a0, _
"hwnd", 0, _
"uint_ptr", 0, _
"long", 0, _
"long", 0, _
"long", 0, _
"long", 0, _
"ptr", 0, _
"ptr", txt.ptr)
EndIf
SendMessage(hTip, TTM_ADDTOOL, 0, buf.ptr)
SendMessage(hTip, TTM_SETMAXTIPWIDTH, 0, 100)
Local BkgColor = 0x000000FF
SendMessage(hTip, TTM_SETTIPBKCOLOR, BkgColor, 0)
SendMessage(hTip, TTM_TRACKACTIVATE, 1, buf.ptr)
SendMessage(hTip, TTM_TRACKPOSITION, 0, MakeInt(gTX, gTY, (auX64 ? 0 : 0)))
Sleep(1000)
sText = "Updating text"
txt.Zero()
txt.SetStr(sText & Chr(0))
SendMessage(hTip, TTM_UPDATETIPTEXT, 0, buf.ptr)
Sleep(1000)
txt.Zero()
txt.SetStr("Bigger parts of text" & Chr(0))
SendMessage(hTip, TTM_UPDATETIPTEXT, 0, buf.ptr)
EndFunc
Func TTipWndProc(hWnd, uMsg, wParam, lParam)
Static IsDrag = 0, _
WM_CREATE = 0x0001, _
WM_DESTROY = 0x0002, _
WM_SHOWWINDOW = 0x0018, _
MK_LBUTTON = 0x0001, _
WM_MOUSEMOVE = 0x0200, _
WM_LBUTTONDOWN = 0x0201, _
WM_LBUTTONUP = 0x0202, _
TTM_TRACKACTIVATE = 1041, _
TTM_TRACKPOSITION = 1042
Static SM_CXDRAG = 68, _
SM_CYDRAG = 69, _
DragWidth = GetSystemMetrics(SM_CXDRAG), _
DragHeight = GetSystemMetrics(SM_CYDRAG), _
StartX = 0, _
StartY = 0
Local x, y
Static tx, ty, buf = Buffer(8)
Switch uMsg
Case WM_SHOWWINDOW
If wParam = 0 Then DllCall("DestroyWindow", "handle", hWnd)
Case WM_DESTROY
Case WM_LBUTTONDOWN
If IsDrag = 0 Then
buf.Zero()
x = BitAND(lParam, 0xFFFF)
y = BitAND(BitShift(lParam,16), 0xFFFF)
StartX = x
StartY = y
buf.SetNum(0, "int", x, "int", y)
DllCall("ClientToScreen", "hwnd", hWnd, "ptr", buf.ptr)
tx = buf.GetNum(0)
ty = buf.GetNum(4)
IsDrag = 1
DllCall("SetCapture", "hwnd", hWnd, "hwnd")
EndIf
Case WM_LBUTTONUP
If IsDrag = 1 Then
WinGetPos("gTX", "gTY", "", "", hWnd)
IsDrag = 0
DllCall("ReleaseCapture")
EndIf
Case WM_MOUSEMOVE
If IsDrag = 1 And BitAND(wParam, MK_LBUTTON) Then
x = BitAND(lParam, 0xFFFF)
y = BitAND(BitShift(lParam,16), 0xFFFF)
If Abs(x - startX) > DragWidth Or Abs(y - startY) > DragHeight Then
buf.Zero()
buf.SetNum(0, "int", x, "int", y)
DllCall("ClientToScreen", "hwnd", hWnd, "ptr", buf.ptr)
x = buf.GetNum(0)
y = buf.GetNum(4)
SendMessage(hWnd, TTM_TRACKPOSITION, 0, MakeInt(gTX+(x-tx), gTY+(y-ty), 0))
EndIf
EndIf
EndSwitch
Return DllCall("CallWindowProcW", _
"ptr", gTTipWndProc, "hwnd", hWnd, "uint", uMsg, "wparam", wParam, "lparam", lParam)
EndFunc |
 Hidden text
P.s.
Эх маэстро маэстро... Ну почему нельзя было сразу так сделать? Сколько же драгоценных часов я потерял, пытаясь найти нужный для себя цвет фона
 Hidden text |
|