Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Autorun
Goto page Previous  1, 2, 3 ... 186, 187, 188, 189, 190  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
AkulaBig



Joined: 03 Dec 2008
Posts: 307

Post (Separately) Posted: Sat May 10, 2025 15:14    Post subject: Reply with quote

Orion9 wrote:
будь я на вашем месте, я сделал бы верхнее меню

Я уже забыл, верхнее меню это что у нас?
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 762

Post (Separately) Posted: Tue May 13, 2025 18:30    Post subject: Reply with quote

AkulaBig wrote:
Я уже забыл, верхнее меню это что у нас?

Это то, к чему Гислер за 30 лет не сделал никакого GUI, хотя именно это нужно было делать в первую очередь, а не отмазываться от пользователя неудобным меню "Запуск", которое, как выяснилось, имеет еще и кривую многоязычную поддержку, исправлять которую он теперь не желает. Как-то так.

Думал, что еще не скоро возьмусь за Autorun, но понадобилась одна фича, над которой сейчас работаю. Простенький монитор каталога, чтобы отслеживал изменения и сообщал об удаленных файлах в реальном времени. Попутно сделал кнопку для подсчета времени воспроизведения в каталоге. Что-то подобное делает плагин MediaTime. При желании можно полностью заменить его функционал, если не устраивает одиночное нажатие кнопки:
 Hidden text

 Hidden text

Функция полностью завязана на плагин TCMediaInfo и его поля, хотя, конечно, можно было и через DllCall сделать, но использование объекта Plugin сводит весь код на Autorun до смешных нескольких строк.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 307

Post (Separately) Posted: Tue May 13, 2025 21:40    Post subject: Reply with quote

Orion9 wrote:
Функция полностью завязана на плагин TCMediaInfo и его поля, хотя, конечно, можно было и через DllCall сделать

У меня наоборот, что-то возникло желание переделать пользовательские колонки на Dll, отказавшись от TCMediaInfo. Его использовать только как листер-плагин. Как-бы в моем понимании это даст какую-то упорядоченность.
Только вот навряд-ли Autorun выдержит еще полей 30. Думаю в данном случае как-раз попробовать использовать файл типа hint.txt или массив значений.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 762

Post (Separately) Posted: Thu May 15, 2025 00:32    Post subject: Reply with quote

AkulaBig wrote:
отказавшись от TCMediaInfo

Имхо, TCMediaInfo один из лучших плагинов, не понятно, зачем от него отказываться. Я наоборот хотел с ним лучше разобраться, т.к. он у меня в подвисшем состоянии остался.
AkulaBig wrote:
Только вот навряд-ли Autorun выдержит еще полей 30.

Да поля-то он, наверное, выдержит, только все-равно не понятно, зачем заменять один плагин другим. В скорости, например, от этого вряд ли получится выиграть, я как раз в этом убедился сейчас.

Пришлось переделать функцию подсчета, убрав из неё получение списка через ProcessExecGetOutput, т.к. этот вариант не работает с UNC-путями. Попутно сделал вызов через DllCall и расширил функционал. Сейчас вызов с ALT делает подсчет через плагин TCMediaInfo.wdx, а простой вызов через MediaInfo.dll. Поскольку MediaInfo.dll обрабатывает все файлы (даже те, которые не-медиа, что замедляет работу), пришлось добавить фильтр. При включеном CapsLock фильтр отключается. Вызов с CTRL ограничивает глубину каталога до первого уповня. SHIFT - выводит в окно отладчика информацию о пропущенных элементах.

 Hidden text
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 307

Post (Separately) Posted: Thu May 15, 2025 07:09    Post subject: Reply with quote

Orion9 wrote:
он у меня в подвисшем состоянии остался

В этом все и дело. Если зайдете в его тему, увидите, что мы там обсуждали некоторые проблемы. Не все гладко с файлом настройки. Вот и получается, что либо там разбираться с настройками, либо здесь пойти по уже проторенной дорожке. Ну а листер-плагину TCMediaInfo альтернативы нет.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 762

Post (Separately) Posted: Thu May 15, 2025 14:06    Post subject: Reply with quote

AkulaBig wrote:
либо там разбираться с настройками, либо здесь пойти по уже проторенной дорожке

Так ведь плагин TCMediaInfo и есть проторенная дорожка. Вопрос здесь больше в изучении самой MediaInfo.dll и её возможностей, чтобы лучше понимать что и в каких случаях выводить. А для этого придётся глубже копнуть в форматы файлов и их устройство, а не только в изучение настроек XML.

Откинул меня подсчёт времени воспроизведения, но вроде доделал как надо, хотя нужно больше тестов. Сейчас повторное нажатие на кнопку прерывает операцию, как и комбинация Win + ESC. Зажатие CTRL + ALT во время подсчёта показывает прогресс операции в подсказке. Обнаружил одну неприятную проблему. MediaInfo.dll может зависнуть на некоторых файлах и повесить ТС. Пока мне попался один такой файл, который нормально проигрывается, но видимо с тегами что-то не так. Foobar при проверке целостности пишет: Warning: Multiple ID3v2 tags encountered, item decoded with minor problems. Программа Mp3Tag пишет: ID3v2.3 ERROR: MP3 header parse error. В остальном проблем больше не заметил. Последняя версия кнопки:


 Hidden text
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 307

Post (Separately) Posted: Thu May 15, 2025 15:05    Post subject: Reply with quote

Orion9 wrote:
придётся глубже копнуть в форматы файлов и их устройство

Копай, не копай. Раз тэги заполняют люди, все равно не угадаешь с заполненными полями. Собственно ведь поля тэгов для всех этих расширений одинаковы.
Orion9 wrote:
а не только в изучение настроек XML

Дак это еще один язык программирования нестандартный. Получается язык Autorun надо изучить и язык TCMediaInfo. Для молодых и умных может и нет проблем. А у нас время ограничено. Не очень интересно этим заниматься.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 762

Post (Separately) Posted: Fri May 16, 2025 00:32    Post subject: Reply with quote

AkulaBig wrote:
Собственно ведь поля тэгов для всех этих расширений одинаковы

MediaInfo.dll больше, чем просто тэги. Гораздо важнее техническая информация, которую дает эта библиотека. И если задача просто вывести некоторые поля из MediaInfo.dll, то, думаю, TCMediaInfo.wdx вполне для этого достаточно. А то, что там используется свой язык, так это только гибкости добавляет, на мой взгляд.

Все, готов монитор. Очень простенький, конечно, но зато рабочий.

Отдельный модуль:
 Monitor.aucfg

Дополнительные функции:
 ListDirectory

 NotifyInfoMessage

Последняя функция используется для показа системных сообщений без отображения значка в трее, но за ней были замечены проблемы на Win8.1 и Win10. Лучше взять доработанный пример из справки от Loopback, у меня времени не хватило, чтобы вставить его в модуль.

Функция следит за удаленными и добавленными файлами и создает лог во временном каталоге. Также в %TEMP% создаются еще два файла, в которых хранится предыдущий снимок и журнал операций. Последний открывается в кнопке-меню по коду 81001. Чтобы украсить меню значками, используются em_ команды:
Code:
[em_dir_monitor_new]
button=%COMMANDER_PATH%\Ini\NewsBar\notify-yes.ico

[em_dir_monitor_old]
button=%COMMANDER_PATH%\Ini\NewsBar\notify-no.ico

[em_dir_monitor_log]
button=%COMMANDER_PATH%\Utilites\AkelPad\AkelPad.exe
cmd=%COMMANDER_PATH%\Utilites\AkelPad\AkelPad.exe
param=tc_dir_monitor.log
path=%TEMP%

[em_dir_monitor_ops]
button=%COMMANDER_PATH%\Utilites\AkelPad\AkelPad.exe
cmd=%COMMANDER_PATH%\Utilites\AkelPad\AkelPad.exe
param=tc_dir_changes.log
path=%TEMP%

[em_dir_monitor_2log]
button=%COMMANDER_EXE%,0
cmd=CD %TEMP%\tc_dir_monitor.log

[em_dir_monitor_2ops]
button=%COMMANDER_EXE%,0
cmd=CD %TEMP%\tc_dir_changes.log

Простой способ запустить монитор в отдельном потоке:
Code:
RunThread ThreadDirMonitor

Func ThreadDirMonitor()
    While 1
        Sleep(180*60*1000)
        DirMonitor(DIR_MONITOR1, 0)
    Wend
EndFunc

Раз в полчаса каталог DIR_MONITOR1 будет проверяться и изменения будут логироваться в файлы, сообщения об изменениях будут отображаться в системных уведомлениях.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 307

Post (Separately) Posted: Fri May 16, 2025 06:12    Post subject: Reply with quote

Orion9 wrote:
И если задача просто вывести некоторые поля из MediaInfo.dll, то, думаю, TCMediaInfo.wdx вполне для этого достаточно.

Я выше написал. Там некоторые поля неправильно выводятся. Надо править его файл настройки xml.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 762

Post (Separately) Posted: Fri May 16, 2025 11:49    Post subject: Reply with quote

AkulaBig wrote:
Я выше написал. Там некоторые поля неправильно выводятся.

У меня не было времени посмотреть, и сейчас тоже не могу, так как много разных дел появилось, но еще вернусь к этому позже.

Обнаружил первый небольшой косячок, забыл добавить FileAppend(sLogFile, sLog) перед Return:
Code:
# каталог не доступен   
    If Not FileExist(sDir) Then
       sLog &= LogFormat(1, "Каталог не доступен.")
       FileAppend(sLogFile, sLog)         
       Return
    Endif

Это не важно, т.к. функцией вряд ли кто-то будет пользоваться в таком виде, я скинул данный код на случай новых идей и решений.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 762

Post (Separately) Posted: Wed May 21, 2025 18:23    Post subject: Reply with quote

Доработал функцию подсчёта. Теперь может обрабатывать список выделенного, и ряд других улучшений:

 Hidden text

 Hidden text

Сделал заодно нечто подобное для торрент-файлов, но каталоги в глубину не обрабатываются, работает только с выделенными объектами на панели:

 Hidden text

 Hidden text
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 762

Post (Separately) Posted: Fri May 23, 2025 00:30    Post subject: Reply with quote

Quote:
ClipGet принимает максимум 16 Кб

Поправка: не 16, а скорее 32. Но DllCall как всегда выручает. По мотивам статьи:
Code:
Local hCB, pMem, obg, CF_UNICODETEXT = 13   
If DllCall("OpenClipboard", "handle", 0) Then
   hCB = DllCall("GetClipboardData", "uint", CF_UNICODETEXT, "handle")
   pMem = DllCall("GlobalLock", "handle", hCB, "ptr")
   obj = Buffer(1024*500, pMem)
   txt = obj.GetStr()
   Free(obj)
   DllCall("GlobalUnlock ", "handle", hCB)
   DllCall("CloseClipboard")
Else
   MsgBox("Clipboard Error" )
EndIf

Здесь буфер размером в 500 Кб. Правильно я понимаю, что это просто "окно" для чтения, а на самом деле память не выделяется?
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1511

Post (Separately) Posted: Fri May 23, 2025 20:26    Post subject: Reply with quote

Orion9
Проблема та же, что была в ProcessExecGetOutput. Доработаю, механизм уже есть. И надо будет проверить, в каких еще функциях может появиться текст большого размера на выходе. Навскидку это только GetWMIValue/WMIQuery.

Orion9 wrote:
что это просто "окно" для чтения, а на самом деле память не выделяется?

Да, она уже выделена GetClipboardData. Если вторым параметром указан адрес, то размер это просто границы диапазона. Для теста ок, но по-хорошему этот размер надо получать c помощью GlobalSize.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 762

Post (Separately) Posted: Fri May 23, 2025 20:28    Post subject: Reply with quote

Вот же, а... Случайно отредактировал предыдущий пост, вместо отправки нового.

Loopback, там было про проблему с функцией ClipGet, которая режет текст из буфера. Используя DllCall удалось обойти это ограничение:
Code:
Local hCB, pMem, obg, CF_UNICODETEXT = 13   
If DllCall("OpenClipboard", "handle", 0) Then
   hCB = DllCall("GetClipboardData", "uint", CF_UNICODETEXT, "handle")
   pMem = DllCall("GlobalLock", "handle", hCB, "ptr")
   obj = Buffer(1024*500, pMem)
   txt = obj.GetStr()
   Free(obj)
   DllCall("GlobalUnlock ", "handle", hCB)
   DllCall("CloseClipboard")
Else
   MsgBox("Clipboard Error" )
EndIf

Но в приведенном коде используется другое ограничение буфера размером в 500 Кб. Правильно я понимаю, что это просто "окно" для чтения из памяти, на самом деле память в таких случаях не выделяется? А как вообще правильно сделать, ведь объем текстовых данных в буфере может быть ещё больше?

Короче, вдохновившись новым лозунгом Autorun "Пока Гислер думает, Autorun делает", соорудил небольшую функцию:
 Hidden text

 Hidden text

Функция еще сырая и абсолютно тестовая, но, кажется, делает то, что от неё требуется. Запуск с CTRL удобен на небольших списках, когда выделенных позиций меньше 100 или где-то около 100, тогда данные обновляются в подсказке в реальном времени. Но чем больше выделено, тем больше тормозов, поэтому на больших списках лучше пользоваться одиночным кликом, так надежнее. Но надо будет с этим что-то придумать.

Добавлено спустя 6 минут:

Ну, что-то у меня совсем не заладилось )
Quote:
по-хорошему этот размер надо получать c помощью GlobalSize.

Не знаю, успею ли глянуть. А можно пример? Вопрос тот же: ак вообще правильно сделать, ведь объем текстовых данных в буфере может быть ещё больше?

Кстати, были кое-какие проблемы с объектом List. Пока не инициализировал принудительно:
Code:
    aSel.Count = 0
    aCol.Count = 0
    aVal.Count = 0
    aRow.Count = 0         

Были какие-то глюки и непонятные результаты.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1511

Post (Separately) Posted: Fri May 23, 2025 22:02    Post subject: Reply with quote

Orion9 wrote:
Случайно отредактировал предыдущий пост, вместо отправки нового.

Я утром успел прочитать, просто не было возможности ответить. Мой ответ выше - первая часть про ClipGet, вторая про вашу функцию.

Orion9 wrote:
А как вообще правильно сделать, ведь объем текстовых данных в буфере может быть ещё больше?

Примерно так (не тестировал):

Code:
pMem = DllCall("GlobalLock", "handle", hCB, "ptr")
size = DllCall("GlobalSize", "handle", hCB, "uint_ptr")
obj = Buffer(size, pMem)
Orion9 wrote:
Кстати, были кое-какие проблемы с объектом List.

Какие именно? Нужна все же какая-то конкретика.
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... 186, 187, 188, 189, 190  Next
Page 187 of 190

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group