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 ... 213, 214, 215
 
Post new topic   Reply to topic    Total Commander Forum Index -> Плагины Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Orion9



Joined: 01 Jan 2024
Posts: 950

Post (Separately) Posted: Sat Nov 29, 2025 20:39    Post subject: Reply with quote

Собственно, три универсальные функции. Код можно добавить в любой модуль.

 Hidden text

Первая функция URLDownloadToFile, о ней было выше. Вместо этой функции можно делать прямой DLL-вызов, как было примере.

Вторая функция WinInetDownloadFile - более продвинутый вариант. Есть "тихий" режим и возможность передавать флаги для стиля подсказки.

Третья функция tip(). Универсальное окно подсказки типа "балун", которое можно использовать в других целях. При первом вызове tip() создается окно и дескриптор сохраняется до конца сессии. Последующие вызовы tip() скрывают и показывают это окно с обновленным текстом. Чем-то это похоже на функцию ShowHint в Autorun.

По умолчанию подсказка показывается у мыши. Возможность задавать координаты отсутствует, но есть флаг "1", который отображает подсказку на позиции предыдущего вызова, а позицию первого вызова можно задать через MouseSetPos, если это нужно.

Всего действуют три флага, их можно суммировать. Флаг "2" делает окно подсказки квадратным, а флаг "4" не делает окно активным после вызова. Но в последнем случае подсказка не будет закрываться по ESC. Когда окно подсказки активно, ESC ее закрывает.

Также ESC прерывает операцию загрузки у функции WinInetDownloadFile, т.е. операцию загрузки можно в любой момент отменить.

После вызова подсказки скрипт движется дальше. Если необходимо дождаться закрытия окна подсказки и затем продолжить выполнение, можно организовать цикл с проверкой состояния через дескриптор. В примере это есть. Текст подсказки можно скопировать в буфер.

Самый простой пример загрузки нескольких файлов:

 Hidden text

Более сложный пример с флагами и циклом ожидания:

 Hidden text

Результат

Закачка открывает большие возможности, примеров применения может быть масса. Главное, что теперь не нужно прибегать к сторонним скриптам и утилитам, а делать это сразу из ТС.

Пример проверки страницы плагинов:

 Hidden text

То же самое, что и парсинг rss-ленты, но загрузка html имеет свои плюсы.

Пример запроса к API метео-сайта и получение csv-файла:

 Hidden text

Ну, и на десерт - загрузка рандомных цитат из разных источников:

 Hidden text


 Hidden text

 Hidden text


Какую функцию лучше использовать, наверное WinInetDownloadFile, она более продвинутая. Но и на URLDownloadToFile многое может работать.

Кнопки:
 Hidden text

 Hidden text

 Hidden text

 Hidden text

 Hidden text

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



Joined: 01 Jan 2024
Posts: 950

Post (Separately) Posted: Sun Nov 30, 2025 14:04    Post subject: Reply with quote

Сразу всего не охватишь, поэтому дополню чуть-чуть с вашего позволения.

Loopback
Поменял местами и всё заработало:
 Hidden text

Т.е ControlSetMouseAction выполняется теперь после SetWindowLong. Похоже, ТС х64 именно это не нравилось.
Loopback wrote:
Создаёт с указанным размером, 256. Размер 255 просто чтобы записанная строка гарантированно завершалось нулем.

Т.е. Wstr:256 создает буфер размером в 256 юникодных символов, что = 512 байт, так следует понимать? В общем, не стал загоняться и сделал как у вас.
 Hidden text

Loopback wrote:
Вот и хорошо, и не нужно обвес для статистики городить.

Да, функционал мне понравился. Точнее сказать, он меня пока устраивает. В последнее время часто приходилось выделять новые диапазоны команд для модулей и хотелась сразу видеть все RegisterCommand. Но и SetHotkeyAction теперь можно быстро посмотреть вместе с ControlSetMouseAction. Правда я не сразу заметил, что ошибся в регулярном выражении. Дожно быть
Code:
RegExp("(.)(" & cmd & ".*?)\r", text)
а не
Code:
RegExp("(.)(" & cmd & ".*?)\r\n", text)
иначе команды расположенные вместе пропускаются.

Такую же мелкую оплошность допустил в модуле MediaInfo. Там должно быть
 Hidden text

вместо
 Hidden text

иначе вместо Duration.Empty всегда будет Duration.Warning на немедиа файлах.
Loopback wrote:
Без кастомной отрисовки нет.

А если через прозрачную иконку реализовать?
Loopback wrote:
По обрезке не знаю

Текст обрезался. Именно поэтому в меню функции tip() я оставил комментарий, чтобы не забыть об этом сообщить
Code:
Func tipmnu()
    Local txt
    txt &= 'MENUITEM "Copy text", em_aucmd ' & (gTipText <> "" ?  "" : "/D") & ' -1 tipcopy' & auCRLF
    Return txt
EndFunc

Func tipcopy()
    #ClipPut %"gTipText"
    ClipPut(gTipText)
EndFunc
ведь tipcopy() это просто костыль, изначально было
Code:
txt &= 'MENUITEM "Copy text", em_aucmd ' & (gTipText <> "" ?  "" : "/D") & ' -1 ClipPut %"gTipText"' & auCRLF
но текст в буфере резался.

Также для этой цели закомментировал
Code:
# Static INVALID_HANDLE_VALUE = auX64 ? 0xFFFFFFFFFFFFFFFF : 0xFFFFFFFF
Static INVALID_HANDLE_VALUE = auX64 ? 18446744073709551615 : 4294967295
поскольку запись 0xFFFFFFFFFFFFFFFF не работала в TC x64.

Когда освободитесь, посмотрите, пожалуйста, в чем может быть дело.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 950

Post (Separately) Posted: Thu Dec 04, 2025 00:39    Post subject: Reply with quote

Добавил к функции tip() флаг TTF_PARSELINKS, позволяющий вставлять в текст подсказки гиперссылки. Функцию пришлось немного доработать, чтобы она могла самостоятельно перехватывать клики по ссылкам. Последняя версия:
 Hidden text

Если в тексте есть гиперссылки, созданные стандартным тегом <a ref>, они будут открываться в браузере. Пример
Code:
<a href="www.example.com">Link</a>
Клики по ссылкам, конечно, еще открывают некоторые возможности. Например, можно сделать что-то вроде советчика, который будет время от времени вызывать окно подсказки, предлагая ознакомиться с той или иной статьей в интернете. Алгоритм такого советчика не должен быть сложным: достаточно загрузить файл, подготовить его к работе, подсчитать количество статей и выбирать переодически соучайный номер с помощью регулярного выражения. Небольшая зарисовка на основе цикла статей www.majorgeeks.com:
 Hidden text

 Hidden text

А если есть локальный файл, который не нужно загружать с интернета, всё вообще можно свести к 5-6 строкам кода, поскольку количество статей заранее известно (в примере это 2096):
 Hidden text

Завтра будет еще пара примеров, нужно только кое-какие нюансы утрясти, а так все готово.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 950

Post (Separately) Posted: Thu Dec 04, 2025 19:37    Post subject: Reply with quote

Loopback
Пока не забыл, лучше сразу напишу. В будущих версиях хотелось бы видеть следущее:

- ShowHint
- ShowPopupMenu

У подсказки хотелось бы фиксировать ширину окна (об этом я уже писал), а также хотелось бы, чтобы окно могло висеть и изменять текст без закрытия (об этом я тоже писал). А вот о чем я не писал, так это об отступе. Не лишним было бы иметь такую возможность. Пока я выхожу из положения заданием пустых строк сверху и снизу и пробелами по краям, но идеальной пропорции добиться не получается
Code:
ShowHint(auCRLF & "    " & HintText & "    " & auCRLF, 0, 0, 1000, 1)

В ShowPopupMenu с параметром /F хочется передовать дополнительный параметр, а не только имя функции. И хотелось бы, чтобы ShowPopupMenu могла возвращать индекс выбранного элемента.

Теперь об упомянутых примерах. Еще один вариант советчика может получиться из файла Russian.cedf. Работать с локальным файлом удобно: он редко изменяется. Единственная сложность, в нем содержится информация не только о ключах, но и секциях, это немного нарушает структуру, как и слишком большой текст некоторых статей. Но при желании все можно учесть. Ниже представлен очень сырой, я бы сказал, "топорный" вариант выборки статей из этого файла:
 Hidden text

 Hidden text

Для обработки клика в тэге <a ref> используется не ссылка, а имя функции, которая вызывает MsgBox.
Code:
<a href="CedfReadDesc()">Читать дальше</a>

Func CedfReadDesc()
    MsgBox(gCedfDesc, "Description", 64+65536+262144)
EndFunc

Еще одно отличие от предыдущего примера: в функцию tip() передаются дополнительные пункты меню, которые используются здесь для отладки, но которые в принципе могут использоваться и для других целей.
 Hidden text

А еще вместо стандартных значков по номеру от 0 до 6 в функцию можно передать дескриптор иконки. Самый простой способ его получить через WM_GETICON от самого окна ТС, но смотрится так себе, нужна другая иконка
 Hidden text

В общем, пример далек от совершенства. Для выборки используется объект BinaryFile с изменением позиции в файле, что чревато большим количеством повторений одних статей и пропуском других. Но это только пример. Если делать серьезно, нужно использовать другие алгоритмы. В следующем примере будет использован объект List с последовательны удалением и перемешиванием элементов.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 950

Post (Separately) Posted: Fri Dec 05, 2025 00:35    Post subject: Reply with quote

Ну вот и последний пример из этой серии. Главное отличие - отдельное меню для управления заданием и его параметрами.
 Hidden text

Некоторые сайты дают доступ не к одной случайной цитате, а к нескольким. Это нужно использовать. Файл скачивается, загружается в объект List и отдает по одной цитате. Можно запустить отдельное задание в потоке, чтобы цитаты самостоятельно скачивались и всплывали через отведенный период. Сейчас стоит 2 минуты, но это только для отладки, интервал можно изменить.

Функция разбита на несколько блоков, поэтому лучше сразу скинуть весь модуль.

 Tips.aucfg
Back to top
View user's profile Send private message
A55555



Joined: 06 Feb 2011
Posts: 71

Post (Separately) Posted: Fri Dec 05, 2025 17:38    Post subject: Reply with quote

Orion9
Здравствуйте.
Разрешите ещё один вопрос по Torrent.aucfg
Есть ли возможность реализовать обратный подход к поиску, наоборот, через имя файла/папки найти его .torrent файл через который он скачивался?

Указываешь папку, где лежат твои .torrent файлы, выделяешь в другом месте файл или папку в случае Blu-Ray диска и оно просматривает содержимое описанное в каждом torrent файле по указанному ранее пути, не само имя torrent файла, а то что в нем внутри прописано.
Если есть совпадение по имени, то выделяет этот torrent файл на противоположной панели.

Естественно подразумевается, что пользователь не менял имена скачанных файлов и понимает необходимость выделить максимально уникальный по имени файл/папку, а не что-то вроде 0001.m2ts внутри Blu-Ray папки.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 950

Post (Separately) Posted: Sat Dec 06, 2025 00:41    Post subject: Reply with quote

A55555
Если икать по размеру папки или файла, то просто. Если делать более тщательный анализ содержимого, то сложнее.

Второй вариант в ближайшее время я сделать не смогу, а первый пожалуйста:
 Hidden text

Вызов - Alt+9. Если TCTorrent у вас не используется как wcx, то уберите последнюю строчку.

Собрал последний бандл всех скриптов. В модуле Test.aucfg оставил только то, что действительно может пригодиться.
https://www.upload.ee/files/18870187/TC_11.56.7z.html
Думаю, 13 косолапых далеко не предел для Autorun. И если он всё ещё не скриптовый язык, то я китайский летчик.
Back to top
View user's profile Send private message
yahuu



Joined: 22 Jun 2023
Posts: 38

Post (Separately) Posted: Sat Dec 06, 2025 15:24    Post subject: Reply with quote

Часть после точки в папке также будет считаться расширением. Например, если папка называется aaa.bbb, то FileGetBaseName вернет aaa.
Back to top
View user's profile Send private message
A55555



Joined: 06 Feb 2011
Posts: 71

Post (Separately) Posted: Sun Dec 07, 2025 02:35    Post subject: Reply with quote

Orion9 wrote:
A55555
Если икать по размеру папки или файла, то просто. Если делать более тщательный анализ содержимого, то сложнее.

Второй вариант в ближайшее время я сделать не смогу, а первый пожалуйста:
 Hidden text

Вызов - Alt+9. Если TCTorrent у вас не используется как wcx, то уберите последнюю строчку.

Orion9
большое спасибо.
Кажется работает, по крайней мере на том, что успел протестировать.
Можно ли прописать не одно, а например 2 места, где лежат мои .torrent
файлы?

Под более сложным вариантом это вы имеете ввиду, чтоб и для частично скачанных находило их .torrent файл?
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 950

Post (Separately) Posted: Mon Dec 08, 2025 00:41    Post subject: Reply with quote

A55555 wrote:
Можно ли прописать не одно, а например 2 места, где лежат мои .torrent
файлы?

Можно, конечно, это напрашивалось сразу. Казалось бы мелочь, но кода получилось бы в два раза больше. В тот момент не мог себе это позволить, т.к. параллельно скрипты собирал и не хотел отвлекаться. Функция была только для теста, я даже команду не стал регистрировать. Вы, кстати, сами можете это сделать, если вам привычнее назначать горячие клавиши через wincmd.ini.

A55555 wrote:
Под более сложным вариантом это вы имеете ввиду, чтоб и для частично скачанных находило их .torrent файл?

Да, и сначала я подумал, что кода получится строк на 300, помня о функции FindTorrentParts, которая чем-то в этом смысле похожа, но можно сделать и проще, правда с некоторыми ограничениями.

 Hidden text

В usercmd.ini нужно добавить пару команд чтобы избавиться временно от входа в torrent-файлы как архивы при автопереходе.
Code:
[em_torrents_goto]
cmd=cm_FocusTrg,em_commander_cd

[em_commander_cd_param]
cmd=CD
param=?%A0

[em_commander_cd]
cmd=CD %COMMANDER_GOTO%

Это временное решение, нужно поинтересоваться у автора плагина, как сделать, чтобы команда CommandExec /CD %'Target' не заходила в файл при переходе и чтобы не было необходимости посылать вслед SendCommand(2002). А также заодно спросить, почему CommandExec("em_torrents_goto", sFound) теряет юникод.

Но это потом.

В общем, создайте файл COMMANDER_PATH & "\Ini\Torrent.txt" с путями. Например:
Code:
d:\Portable\uTorrent\torrents
d:\Temp\Test
d:\Temp
d:\Temp\Software
d:\Test\TorrentData

Глубина каталогов не учитывается. Попробуйте, как все работает. Думаю, смысла нет подробно описывать работу функционала, там вроде все прозрачно.
Back to top
View user's profile Send private message
A55555



Joined: 06 Feb 2011
Posts: 71

Post (Separately) Posted: Mon Dec 08, 2025 02:34    Post subject: Reply with quote

Orion9
спасибо, работает очень лихо. Не смог найти проблем пока что.
Такой механизм заслуживает кнопки на панели TC.

И получается теперь можно и для частично скачанного найти .torrent файл, указав именно файл (не папку) для частично скачанного случая. Спасибо.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 950

Post (Separately) Posted: Mon Dec 08, 2025 13:20    Post subject: Reply with quote

A55555 wrote:
Такой механизм заслуживает кнопки на панели TC.

Пожалуй, да. Кнопку сделать можно, и это несложно. В топике примеры были. Нужно зарегистровать команду и добавить хоткей в секцию Shortcuts, вероятно, так будет лучше.
Code:
RegisterCommand 70509 "SearchForTorrents"

Code:
[Shortcuts]
A+M=em_torrents_search

Code:
[em_torrents_search]
cmd=70509

И так действительно лучше: сохраняется гибкость в настройке комбинаций средствами самого ТС + зарегистрованный код получает em_имя, которое можно использовать где угодно.
A55555 wrote:
И получается теперь можно и для частично скачанного найти .torrent файл, указав именно файл (не папку) для частично скачанного случая.

Да теперь работает в обе стороны: поиск торрент-данных по торрент-файлу и поиск торрент-файла по торрент-данным.

А папку можно искать только корневую, здесь вы правы. Думаю, искать подпапки во вложениях смысла нет - только создаст дополнительные сложности в реализации, а точности не прибавит.

Можно подумать, как разделить поиск по размеру (первый проход) и поиск по имени файла (второй проход). Думаете, есть смысл разделить функцию на два отдельных поиска? Просто я не уверен, что это сильно нужно, если только не приходится часто искать именно глубоким поиском, а не просто по размеру раздачи.
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 ... 213, 214, 215
Page 215 of 215

 
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