Orion9

|
Posted: Sun Sep 07, 2025 18:24 Post subject: |
|
|
A55555
Правильно сделали, что закомментировали ту строку, она была только для тестов и отладки.
A55555 wrote: | Подскажите пожалуйста ещё, как окно счетчика чучуть подвинуть вправо и вверх от центра экрана или лучше не трогать? |
Вверх - понять могу, но почему вправо? Окно и правда смотрится чуть ниже центра из-за выравнивания по рабочему столу без учета панели задач. Loopback уже предложил решение, но как альтернативный вариант окно можно приподнять функцией WinSetPos. Если позиция будет неоднократно меняться, лучше не использовать флаг WS_VISIBLE при создании окна функцией CreateWindowExW (т.е. станет 0x00C80000 вместо 0x10C80000), а делать его видимым только после всех манипуляций. Вот такой альтернативный вариант вполне приемлим:
Code: | h_WinShutdown = DllCall("CreateWindowExW", _
"dword", 0, _
"wstr", "msctls_progress32", _
"wstr", "", _
"dword", 0x00C80000, _
"int", 200, "int", 100, "int", Round(Scale(300)*nTextScale,0), "int", Scale(50), _
"handle", , _
"handle", 0, "handle", 0, "ptr", 0, _
"handle")
If h_WinShutdown = 0 Then Return 0
# поверх всех окон
WinSetState(30, h_WinShutdown)
# выравнивание по центру рабочего стола
WinAlign(h_WinShutdown, 0, DllCall("GetDesktopWindow"))
# перемещение окна вверх на 50 пикселей
WinSetPos("", -Scale(50), "", "", 1, h_WinShutdown)
# перемещение окна вправо на 50 пикселей
# WinSetPos(Scale(50), "", "", "", 1, h_WinShutdown)
# показ окна
WinSetState(5, h_WinShutdown)
|
Если нужен сдвиг вправо, то за него отвечает отдельная строка.
Вообще-то, функционал классный получается, но пока он еще далек от завершения. Как было справедливо отмечено, нужна дополнительная обработка различных сценариев (неожиданное завершение операции, непредвиденные диалоговые окна, кнопка "В фоне" и т.д.), и это нормально. Иногда требуется 1-2 месяца, чтобы довести все до ума, это еще при частом использовании, а не редком.
A55555 wrote: | Надеюсь кроме меня ещё кому-то пригодится. |
Сейчас заметил, что "Return" немного не туда поставил, что приводит к появлению подсказки при старте ТС, даже если прозрачность отключена и не используется. Лучше заменить на другой фрагмент:
Code: | If nAction = 0 Then
IniRead transp %COMMANDER_INI% "Autorun" "Transparency" 255
If transp >= 100 And transp < 255 Then
WinSetStyle(0x80000, 3)
DllCall("SetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _
"ptr", 0, "byte", transp, "dword", 2)
EndIf
Return
EndIf |
Вообще, Autorun позволяет добавить кучу уникальных фич, которые сам Гислер вряд ли будет когда-то делать. Где-то полгода назад я собирал интересные скрипты, вот перезаливка. С тех пор еще поднакопилось, и когда будет время, обязательно выложу. Например, летом активно юзал подсчет времени у аудио и видео файлов. Гислера тоже просили добавить эту фичу, но когда он ее сделает, не известно. А может и вовсе не сделает. Если вдруг интересно, то вот, прикладываю сразу с подсчетом торрент-файлов:
 Hidden text Code: | RegisterCommand 62013 "Duration"
Global MI_DURATION = 0, MI_BREAK = false
Func Duration(lParam)
If MI_DURATION > 0 Then
MI_BREAK = true
Sleep(250)
Return
EndIf
RunThread DurationInfo
EndFunc
Func DurationInfo()
Local T1 = GetUptime(), T2 = T1
Local b_Ctrl = IsPressed(0x11), b_Shift = IsPressed(0x10), b_Alt = IsPressed(0x12)
Local b_Caps = BitAND(DllCall("GetKeyState", "int", 0x14, "short"), 1)
Local hMI = 0
Static sLib = "MediaInfo" & (auX64 ? "" : "_i386") & ".dll", _
hLib = DllCall("LoadLibrary", "wstr", COMMANDER_PATH & "\Ini\Tools\Libs\" & sLib, "ptr")
Static sExt = ".aac .ac3 .aif .aiff .aifc .afc .ape .au .snd .cda .dsf .dts .dtswav .dtshd .dtsma .eac3 _
.flac .fla .m1a .m2a .mka .mpa .mp1 .mp2 .mp3 .mp4 .m4a .m4b .m4r .mod .mpc .mp+ .mpp _
.oga .ogx .ogg .ra .spx .opus .qoa .svx .8svx .tak .tta .wav .wave .w64 .bwf .rf64 .wma .wv _
.avi .wmv .wmp .wm .asf .mpg .mpeg .mpe .m1v .m2v .mpv2 .mp2v .ts .tp .tpr .trp .vob .ifo _
.ogm .ogv .mp4 .m4v .m4p .m4b .3gp .3gpp .3g2 .3gp2 .mkv .rm .ram .rmvb .rpm .flv .swf .mov _
.qt .amr .nsv .dpg .m2ts .m2t .mts .dvr-ms .k3g .skm .evo .nsr .amv .divx .webm .wtv .f4v .mxf"
If Not b_Alt Then
If hLib = 0 Then
ShowHint("Error LoadLibrary " & sLib)
Return
EndIf
hMI = DllCall(sLib & '\MediaInfo_New', "Ptr")
If hMI = 0 Then
ShowHint("MediaInfo.dll failed to create new object")
Return
Endif
Else
Local obj = Plugin("TCMediaInfo")
If ERROR <> 0 Then
ShowHint("TCMediaInfo.wdx plugin error " & ERROR)
Return
Endif
EndIf
Local s = 0
Local aSel = List()
aSel.Text = GetSelectedItems(3, 0)
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
If aSel.Count = 0 Then
If Not FileExist(sFile) Then
ShowHint("Файл не существует " & sFile)
Free(aSel)
Return
Endif
EndIf
If aSel.Count = 0 And Not StrPos(FileGetAttr(sFile), "D") Then
Free(aSel)
If b_Alt Then
obj.FileName = sFile
s = obj.GetValue(0) # duration
Free(obj)
Else
If DllCall(sLib & '\MediaInfo_Open', 'ptr', hMI, "wstr", sFile, "uint") <> 1 Then
Return ShowHint("MediaInfo.dll failed to open file " & sFile)
EndIf
s = DllCall(sLib & '\MediaInfo_Get', _
'ptr', hMI, "int", 0, "int", 0, "wstr", "Duration/String3", "int", 1, "int", 0, "wstr")
EndIf
Return ShowHint("Файл: " & sName & auCRLF & "Длительность: " & s)
Endif
ShowHint("Загрузка")
MI_BREAK = false
MI_DURATION = 1
Local i, j, k, dirs = 0, files = 0, errs = 0, item = 0, aFiles = List(), seconds = 0, b_Hint = 0
Local depth = (b_Ctrl ? 1 : 0)
b_Win = false
# загрузка файлов в массив
If aSel.Count > 0 Then
For j = 0 To aSel.Count - 1
sFile = sPath & aSel[j]
If FileExist(sFile) Then
k += 1
aFiles.Add(sFile)
If StrPos(FileGetAttr(sFile), "D") Then ListDirectory(sFile, aFiles, depth)
EndIf
Next
sName = "S/A: " & aSel.Count & "/" & k # Selected / Available
Else
aFiles.Add(sFile)
ListDirectory(sFile, aFiles, depth)
EndIf
Free(aSel)
If aFiles.Count > 1 Then
ShowHint("Depth: " & depth & auCRLF & _
"CapsLock: " & (b_Caps ? "Yes" : "No") & auCRLF & _
(b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"Элементов: " & aFiles.Count & auCRLF & _
"Подсчёт времени...")
EndIf
T2 = GetUptime()
For i = 0 To aFiles.Count - 1
If b_Win Then OutputDebugString("Duration.File:" & aFiles[i])
If StrPos(FileGetAttr(aFiles[i]), "D") Then
dirs += 1
If b_Shift Then OutputDebugString("Duration.Directory:" & aFiles[i])
Continue
EndIf
item += 1
If b_Alt Then
obj.FileName = aFiles[i]
s = obj.GetValue(0,3) # duration -> milliseconds
Else
ext = FileGetExt(aFiles[i])
If Not b_Caps Then
If Not StrPos(sExt, '.' & ext) Then
If b_Shift Then OutputDebugString("Duration.Filter:" & aFiles[i])
Continue
EndIf
EndIf
If DllCall(sLib & '\MediaInfo_Open', 'ptr', hMI, "wstr", aFiles[i], "uint") <> 1 Then
errs += 1
If b_Shift Then OutputDebugString("Duration.Error:" & aFiles[i])
Continue
EndIf
s = DllCall(sLib & '\MediaInfo_Get', _
'ptr', hMI, "int", 0, "int", 0, "wstr", "Duration", "int", 1, "int", 0, "wstr")
EndIf
If s > 0 Then
seconds += s
files += 1
Else
If b_Shift Then OutputDebugString("Duration.Empty:" & aFiles[i])
EndIf
If MI_BREAK = true Or (IsPressed (0x11) And IsPressed (0x1B)) Then
ShowHint("Операция прервана")
Sleep(500)
Break
EndIf
#If Not (IsPressed(0x11) And IsPressed(0x12)) Then
If IsPressed(0x10) Then
b_Hint += 1
If Round(GetUptime() - T2, 0) > 500 Then
ShowHint( _
(b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"CapsLock: " & (b_Caps ? "Yes" : "No") & auCRLF & _
"Depth: " & depth & auCRLF & _
"File: " & i & " of " & aFiles.Count _
)
T2 = GetUptime()
EndIf
Else
If b_Hint > 0 Then
b_Hint = 0
ShowHint("Depth: " & depth & auCRLF & _
"CapsLock: " & (b_Caps ? "Yes" : "No") & auCRLF & _
(b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"Элементов: " & aFiles.Count & auCRLF & _
"Подсчёт времени...")
EndIf
EndIf
Next
If b_Alt Then Free(obj)
If hMI <> 0 Then DllCall(sLib & '\MediaInfo_Delete', "Ptr", hMI)
MI_BREAK = false
MI_DURATION = 0
seconds = Floor(seconds / 1000)
Local day = Floor(seconds / 86400)
Local hour = Floor((seconds - (day * 86400)) / 3600)
Local min = Floor(((seconds - (day * 86400)) - (hour * 3600)) / 60)
Local sec = seconds - (day * 86400 + hour * 3600 + min * 60)
Local total = StrFormat("%02d:%02d:%02d:%02d",day,hour,min,sec)
Local tl = Round(GetUptime() - T1, 0) / 1000
Local txt = "Имя: " & sName & auCRLF & _
"Каталогов: " & dirs & auCRLF & _
"Элементов: " & aFiles.Count & auCRLF & _
"Обработано: " & files & " из " & item & auCRLF & _
"Ошибки DLL: " & errs & auCRLF & _
"Секунды: " & seconds & auCRLF & _
"Минуты: " & Round(seconds / 60, 2) & auCRLF & _
"Часы: " & Round(seconds / 3600, 2) & auCRLF & _
"Сутки: " & Round(seconds / 86400, 2) & auCRLF & _
"Время: " & Chr(0x2211) & " "& total & auCRLF & _
"Powered by " & (b_Alt ? "TCMediaInfo.wdx" : "MediaInfo.dll") & auCRLF & _
"Время операции: " & StrFormat("%.3f", tl) & " sec"
Free(aFiles)
ClipPut(txt)
ShowHint(txt)
EndFunc
RegisterCommand 62014 "TorrentSize"
Func TorrentSize(lParam)
Local T1 = GetUptime()
Local obj = Plugin("TCTorrent")
If ERROR <> 0 Then
ShowHint("TCTorrent.wdx plugin error " & ERROR)
Return
Endif
Local size = 0, files = 0
Local aSel = List()
aSel.Text = GetSelectedItems(3, 0)
Local sPath = RequestCopyDataInfo("SP")
Local sName = RequestCopyDataInfo("SN")
Local sFile = sPath & sName
Local lRet = false
If aSel.Count = 0 Then
If Not FileExist(sFile) Then
ShowHint("Файл не существует " & sFile)
lRet = true
ElseIf StrPos(FileGetAttr(sFile), "D") Then
ShowHint("Каталог " & sFile)
lRet = true
Else
obj.FileName = sFile
files = obj.GetValue(1)
size = obj.GetValue(2,0) # size -> bytes
Free(obj)
Endif
EndIf
If lRet Then
Free(obj, aSel)
Return
EndIf
If aSel.Count > 10 Then
ShowHint("Выделено: " & aSel.Count & auCRLF & "Подсчёт времени...")
EndIf
Local j, k = 0, dirs = 0, torrs = 0
If aSel.Count > 0 Then
For j = 0 To aSel.Count - 1
sFile = sPath & aSel[j]
If FileExist(sFile) Then
k += 1
If Not StrPos(FileGetAttr(sFile), "D") Then
obj.FileName = sFile
s = obj.GetValue(2,0)
If s > 0 Then
size += s
files += obj.GetValue(1)
torrs += 1
Endif
Else
dirs += 1
Endif
EndIf
Next
sName = "S/A: " & aSel.Count & "/" & k # Selected / Available
Else
Return ShowHint("" & sName & auCRLF & _
"Размер: " & SizeFormat(size, 1, 'G', 2, 1) & auCRLF & _
"Файлов: " & files)
EndIf
Local tl = Round(GetUptime() - T1, 0) / 1000
ShowHint((k = aSel.Count ? "" : "Файл " & sName & auCRLF) & _
"Элементов: " & aSel.Count & auCRLF & _
"Обработано: " & torrs & auCRLF & _
"Каталогов: " & dirs & auCRLF & _
"Размер: " & SizeFormat(size, 0, 'M', 2) & auCRLF & _
"Размер: " & SizeFormat(size, 0, 'G', 2) & auCRLF & _
"Размер: " & SizeFormat(size, 0, 'T', 4) & auCRLF & _
"Файлов: " & files & auCRLF & _
"Powered by TCTorrent.wdx" & auCRLF & _
"Время операции: " & StrFormat("%.3f", tl) & " sec")
Free(obj, aSel)
EndFunc
|
 Кнопка Code: | TOTALCMD#BAR#DATA
62013
%COMMANDER_EXE%
Подсчёт времени воспроизведения|Alt - Использовать TCMediaInfo.wdx|Ctrl - Глубина каталога = 1|Shift - Вывод информации в отладчик|CapsLock - Отключить фильтр расширений
0
-1
|
 Кнопка Code: | TOTALCMD#BAR#DATA
62014
%COMMANDER_EXE%
Подсчёт размера .torrent файлов
0
-1
|
Поменяйте только путь к библиотеке MediaInfo.dll, у меня это "COMMANDER_PATH & "\Ini\Tools\Libs\". И желательно иметь установленные плагины TCMediaInfo и TCTorrent от Loopback. Во время подсчета, если операция длительная, работает клавиша SHIFT, отображающая прогресс операции в текстовом виде. Подсчет размера торрент-файлов менее востребованная фишка, но если, например, диски под завязку, а файлы имеются, бывает необходимость прикинуть, сколько места они могут занять. Я, к примеру, сталкивался с таким.
А что касается полного экрана, то, разумеется, я видел этот код от Flasher, однако попробовать и обкатать его руки не дошли. У себя я использую TCFS2 для этих целей уже много лет, но со временем доберусь и до Autorun.
Кстати, полный экран не обязательно вызывать только горячей клавишей, можно сделать и в верхнем меню соответсвующую кнопку, тоже будет удобно. В файле меню после HELP_BREAK вставить MENUITEM ":::", em_FullScreen, где em_FullScreen - пользовательская команда для вызыва TCFS2. Возможно, вы знали о таком использовании, но так, на всякий случай написал. |
|