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 ... 175, 176, 177 ... 184, 185, 186  Next
 
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: 716

Post (Separately) Posted: Thu Feb 27, 2025 00:23    Post subject: Reply with quote

Loopback
Теперь работает )

Добавив такую функцию в Autorun, вы, конечно, дали ключ от всех дверей, но проблем хватает Very Happy Я не имею в виду этот небольшой баг с "ulong_ptr". Чтобы в полной мере пользоваться WIN API, нужно много знать и понимать, как работает Windows. Одним лишь сайтом Microsoft тут не обойтись.

Но кое-что можно уже пробовать и воплощать. Например, я сначала увлёкся иконкой в трее ради интереса, но теперь понимаю, что жить без неё не могу Mr. Green

Многое ещё не доделано, но кое-что продемонстрировать уже можно:

 Hidden text

Вверху коды кнопок. Можно запустить два потока, чтобы иконка сама менялась в фоне с интервалом:
 Hidden text

Одмн поток меняет язык раз в 5 секунд, другой следит за сменой языка. Как только язык меняется, меняется и иконка.
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Sat Mar 01, 2025 00:20    Post subject: Reply with quote

После внесения некоторых изменений можно считать, что данный вариант функций для работы с иконками в трее, более-менее законченный:
 Hidden text

Добавил туда важных комментариев, которые позволят быстрее разобраться, но если коротко, сейчас используются две функции: одна для добавления иконок в трей и работы с ними (NotifyIcon), другая - только для показа уведомлений (NotifyInfoMessage):

 Hidden text

Кнопки для тестов:
 Hidden text

 Hidden text

 Hidden text

Первая кнопка включает или отключает иконку в трее, вторая меняет иконку и показывает сообщения, третья тестируют уведомления.

В основном файле конфигурации важно не забыть удалить иконки при выходе в секции финализации:
 Hidden text


Loopback, хотел попробовать сделать по мотивам темы:
https://www.autohotkey.com/boards/viewtopic.php?t=110783
Там есть рабочий код на AutoHotkey, вроде ничего сложного:
 Hidden text

И вроде выложили последние библиотеки:
https://github.com/telppa/ahk-chardet/tree/main/Lib
Я проверил - скрипт на них работает. Решил сделать то же самое на Autorun, но последняя функция возвращает пустую строку. Если у вас будет время, посмотрите, пожалуйста, в чём может быть причина. Здесь даже два варианта )
 Hidden text

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



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Sun Mar 02, 2025 19:32    Post subject: Reply with quote

Orion9 wrote:
Решил сделать то же самое на Autorun, но последняя функция возвращает пустую строку.

В Autorun сейчас при задании cdecl тип параметра не опционален. Можно использовать int:cdecl для uchardet_get_charset. Сделаю опциональным.

Вторая проблема в том, что типы str/wstr в качестве возвращаемого значения по факту не работали. Я точно тестировал такой случай, но с тех пор, похоже, сломал. Исправил.

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



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Sun Mar 02, 2025 20:23    Post subject: Reply with quote

Loopback wrote:
сегодня будет новая версия.

Супер )

А можно ли сделать, чтобы GetState("threads") возвращала имена потоков в своём результате? А то сейчас не так просто понять "who is who" ))

 Hidden text

Два раза сбрасывал код и два раза забывал спросить. Параметры по-умолчанию, которые можно опускать в функциях, обязательно надо заменять пустыми кавычками? Первый вариант рабочий:
Code:
NotifyIcon("set", 1001, 99999, hIco, "", "Icon changed to shell32.dll, " & i, "", NIIF_INFO)

Второй приводит к неожиданным результатам:
Code:
NotifyIcon("set", 1001,, hIco,, "Icon changed to shell32.dll, " & i,, NIIF_ERROR)


Ещё пара вопросов по поводу переменных окружения в будущих версиях:

1. В дериктиве Pragma можно будет оставить всё без изменений? Такая запись и дальше будет рабочей?
Code:
Pragma Include %COMMANDER_PATH%\Ini\Scripts\Test.aucfg


2. Если есть переменная Local Dir = "%COMMANDER_PATH%\Ini\", то в командах: %"Dir%" равно "%COMMANDER_PATH%\Ini\", а %"%Dir%" равно "C:\Portable\TOTALCMD\Ini\"? Если да, то не изменится ли такое поведение в будущих версиях, или надо как-то по-другому раскрывать?
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Sun Mar 02, 2025 22:43    Post subject: Reply with quote

Orion9 wrote:
имена потоков

Если только имя вызываемой пользовательской функции, какие еще имена у потоков могут быть? Забавно, код для этого уже был сделан, но забыл включить. Хотя я до сих пор так и не понимаю, какой смысл в этой информации...

Orion9 wrote:
Параметры по-умолчанию, которые можно опускать в функциях, обязательно надо заменять пустыми кавычками?

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

Orion9 wrote:
Такая запись и дальше будет рабочей?

Здесь ничего не планировалось менять.

Orion9 wrote:
Если да, то не изменится ли такое поведение в будущих версиях,

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



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Sun Mar 02, 2025 23:35    Post subject: Reply with quote

Loopback wrote:
Забавно, код для этого уже был сделан, но забыл включить. Хотя я до сих пор так и не понимаю, какой смысл в этой информации.

Когда крутился один-два потока, смысла большого не было, согласен. Но сейчас у меня бывает по 5-6 потоков крутится, так как приходится часто эксперементировать. Как-то раз забыл закомментировать один поток, после того, как он перестал быть нужным, так я потом понять долго не мог, откуда он взялся Confused

Имя потока - это я неправильно выразился. Речь идет об имени функции, как вы правильно отметили.
Loopback wrote:
В настоящее время метод записи с пропусками официально не поддерживается и делать так я бы не рекомендовал

Не совсем понял. То есть обе записи следует избегать, и с кавычками тоже?
Loopback wrote:
конкретно в работу вычисляемых строк я не собирался вмешиваться, это уже своего рода legacy.

Просто я пересматриваю сейчас код. Заметил, что в некоторых случаях у меня завязано именно на раскрытие переменных окружения, но в большинстве других используется избыточная запись, например:
Code:
i  += 1
IniWrite %bar% "Buttonbar" %"'Menu'   & %i%"  %"%i%-2"
Я все такие записи исправил на:
Code:
IniWrite %bar% "Buttonbar" %"'Menu'   & i"  %"i-2"

Но иногда нужно, чтобы переменная раскрылась:
Code:
SetEnv COMMANDER_VIDEO %"%SoftVideo%"

или:
Code:
ProcessExecGetOutput /OEM out %COMSPEC% "/c dir /s /b *.wav" %"%dir%"

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

Хотел еще про определения яыка спросить. Мне нужно узнать, является ли система англоязычной (UI), если нет, то считать её русской. Как вы думаете, такая функция подойдет?
 Hidden text

Хотел добавить возможность обработки англоязычной вкладки:
 Hidden text
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Mon Mar 03, 2025 00:36    Post subject: Reply with quote

Версия Autorun 2.2.17 beta

 Список изменений


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

 Список затронутых функций


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

 Подробно про исправление



Все же очень неудобна эта фича форума со склеиванием последовательных сообщений. Было бы куда логичнее выложить версию в одном посте, а ответы дать в другом...

Orion9 wrote:
То есть обе записи следует избегать, и с кавычками тоже?

Это про вторую. С первой вопросов нет.

Orion9 wrote:
Я все такие записи исправил на:

Правильно.

Orion9 wrote:
Но иногда нужно, чтобы переменная раскрылась:

Похоже, я не совсем точно понял изначальный вопрос.

Quote:
Если есть переменная Local Dir = "%COMMANDER_PATH%\Ini\", то в командах: %"Dir%" равно "%COMMANDER_PATH%\Ini\", а %"%Dir%" равно "C:\Portable\TOTALCMD\Ini\"?

Разве? В первом случае лишний %, предполагаю опечатка. Вот код:

Code:
Local Dir = "%COMMANDER_PATH%\Ini\"

# тут содержимое не раскрывается OutputDebugString, поэтому выводит как есть
OutputDebugString %"Dir"
OutputDebugString %"%Dir%"

# тут содержимое второй раз раскрывается самим MsgBox
MsgBox %"Dir"
MsgBox %"%Dir%"


В любом случае выводит одинаковый результат.

Всё что внутри вычисляемой строки - считается выражением и подчиняется их правилам. А значит, в следующей версии такие записи %"%i%-2" тоже будут некорректны. Кстати забыл про этот вариант, надо его упомянуть в анонсе.

Такие записи идентичны, и правильной в будущем будет вторая:

Code:
SetEnv COMMANDER_VIDEO %"%SoftVideo%"
SetEnv COMMANDER_VIDEO %"SoftVideo"


Но вообще-то SetEnv и без вычисляемых строк поддерживает переменные:

Code:
SetEnv COMMANDER_VIDEO %SoftVideo%


И тут по тому же принципу:

Code:
ProcessExecGetOutput /OEM out %COMSPEC% "/c dir /s /b *.wav" %"dir"


В общем поэтому и надо привести всё к одному знаменателю, а то неслабая путаница возникает.


Orion9 wrote:
такая функция подойдет?

Мне кажется странной идея считать систему русской, если она не английская, а так с виду ок. Но не уверен.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 262

Post (Separately) Posted: Mon Mar 03, 2025 15:20    Post subject: Reply with quote

Loopback wrote:
Некоторые записи могут перестать работать

Code:

ShellExec %COMMANDER_PATH%\Utilities\MENUIMG\MENUIMG.exe %COMMANDER_PATH%\Bars\RESTART_RUS.BAR||#INPUT
IniRead /R flt %COMMANDER_INI% "Associations" "Filter1" ""
SetEnv AssocIco "%COMMANDER_PATH%\Images\Others\ICO\Light\LightOn.ico"

После обновления до Autorun 2.2.17 beta все эти выражения и подобные продолжают работать. Это правильно или надо их заранее переписать?
А переменные и до обновления только так работали:
Code:

Local ini_WinTitle = %COMMANDER_PATH% & "\Ini\WinTitle.ini"

Тогда что изменилось?
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Mon Mar 03, 2025 18:11    Post subject: Reply with quote

Loopback
Всё заработало влёт, я аж офигел ) Спасибо!
Code:
Pragma AutorunPluginFields "CharSet:::CharDetect"

Func CharDetect(FileName, FieldIndex, UnitIndex)
    Static sLib = "uchardet" & (auX64 ? "" : "_x86") & ".dll", _
           hLib = DllCall("LoadLibrary", "wstr", COMMANDER_PATH & "\Ini\Tools\Libs\" & sLib, "ptr")
           
    If hLib = 0 Then Return "#Error# LoadLibrary " & sLib
   
    Static hUC = DllCall(sLib & '\uchardet_new', 'ptr:cdecl')
    If hUC = 0 Then Return "#Error# uchardet_new returned 0"
   
    DllCall(sLib & '\uchardet_reset', 'ptr', hUC, 'cdecl')
    ProcessExecGetOutput buf %COMSPEC% '/c type "%FileName%"'     
   
    Local size = StrLen(buf)
    Local Res = DllCall(sLib & '\uchardet_handle_data', 'ptr', hUC, 'str', buf, 'uint', size, 'int:cdecl')
    If Res > 0 Then Return "#Error# uchardet_handle_data returned " & Res

    DllCall(sLib & '\uchardet_data_end', 'ptr', hUC, 'cdecl')   
    Return DllCall(sLib & '\uchardet_get_charset', 'ptr', hUC, 'str:cdecl')
    #DllCall('uchardet\uchardet_delete', 'ptr', hUC, 'cdecl')
EndFunc

Знаю, что ProcessExecGetOutput для этих дел не годится, но это только эксперимент. Надеюсь, в будущем у Autorun найдутся свои функции для открытия файлов на чтение Very Happy А пока можно через консольную утилиту гнать:
https://github.com/gentlehill/uchardet?tab=readme-ov-file
и код совсем простой:
Code:
Func EncDetect(FileName, FieldIndex, UnitIndex)
    Local pipe, exe_tool = COMMANDER_PATH & "\Ini\Tools\uchardet.exe"
    ProcessExecGetOutput pipe %exe_tool% '"%FileName%"'   
    Return pipe
EndFunc

И большое спасибо за имена функций в GetState. Теперь выглядит как надо:
Code:
Thread #1:
    Origin: Main
    ThreadID: 3388
    Started: 03.03.2025 16:47:52

Thread #2:
    Origin: RunThread
    Function: ThreadTitle
    ThreadID: 4704
    Started: 03.03.2025 16:47:53

Thread #3:
    Origin: RunThread
    Function: ThreadNewsbar
    ThreadID: 3404
    Started: 03.03.2025 16:47:53

Thread #4:
    Origin: RunThread
    Function: ThreadSounds
    ThreadID: 1536
    Started: 03.03.2025 16:47:53

Это далеко не всё. Ещё позже отпишусь.

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

AkulaBig
Скорее всего вам придется, как и мне, избавляться от таких записей:
Code:
%"%SoftVideo%"

К сожалению, на ранних этапах использования Autorun я не разобрался с этой записью и допустил ошибку. Теперь приходится все исправлять.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 262

Post (Separately) Posted: Mon Mar 03, 2025 18:22    Post subject: Reply with quote

Orion9 wrote:
Скорее всего вам придется, как и мне, избавляться от таких записей:

Я еще в прошлый раз от них избавился по наводке Loopback. А сейчас посмотрел, есть еще одна такая запись.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Mon Mar 03, 2025 21:29    Post subject: Reply with quote

AkulaBig wrote:
После обновления до Autorun 2.2.17 beta все эти выражения и подобные продолжают работать. Это правильно или надо их заранее переписать?

Правильно. Я же специально акцентировал внимание, что изменения коснулись только функций по списку и только в функциональной записи.

Эти три функции хоть и в списке, но они записаны в командной записи, их трогать не нужно.

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

AkulaBig wrote:
Тогда что изменилось?

Так, а анонс-то для чего? Smile Там же чётко написано, на какие случаи надо обратить внимание. Их всего-то два. В посте выше спойлер Подробно про исправление.

Для лучшего понимания, ваш первый пример. Если бы он был записан так:

Code:
ShellExec("%COMMANDER_PATH%\Utilities\MENUIMG\MENUIMG.exe", "%COMMANDER_PATH%\Bars\RESTART_RUS.BAR||#INPUT")


то в предыдущей версии он бы работал, а в новой гарантированно сломался.

Orion9 wrote:
найдутся свои функции для открытия файлов на чтение

Обязательно найдутся.

Orion9 wrote:
на ранних этапах использования Autorun я не разобрался с этой записью и допустил ошибку

Не исключаю, что возможно я и сам когда-то где-то писал так же. В то время были такие, не самые удачные решения, типа для "облегчения перехода" и "сохранения совместимости". А в итоге всё равно приходится менять.
Back to top
View user's profile Send private message
AkulaBig



Joined: 03 Dec 2008
Posts: 262

Post (Separately) Posted: Mon Mar 03, 2025 21:38    Post subject: Reply with quote

Loopback wrote:
Так, а анонс-то для чего?

Все ясно. Просто хотелось вашего разъяснения. Сразу стало наглядно понятно, как должны выглядеть правильные записи.
А то я левым полушарием разбираюсь с Autorun, правым WinDjView, написанным на MFC. Сделал плагин для него. А там полно рогаток, пришлось кодить. И тут и там методом тыка. Аж самому смешно Embarassed
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Tue Mar 04, 2025 00:19    Post subject: Reply with quote

Loopback wrote:
Похоже, я не совсем точно понял изначальный вопрос.

Просто мне не нужно было мудрить с ним ) Надо было просто спросить, равны ли эти две записи или нет. Да и вообще, стоило самому проверить прежде, чем на форум писать.
Loopback wrote:
В первом случае лишний %, предполагаю опечатка.

Да, опечатка. Причём дурацкая и в самом ненужном месте )
Loopback wrote:
В любом случае выводит одинаковый результат.

Не знаю, откуда у меня взялась идея, что проценты в вычисляемой строке раскрывают переменные окружения. Но иногда требуется именно раскрыть. Т.е. если SoftVideo = "%POT_PLAYER%", а POT_PLAYER = "%COMMANDER_PATH%\Soft\PotPlayer\PotPlayerMini.exe", то:
Code:
SetEnv COMMANDER_VIDEO %SoftVideo%

Не раскроет переменную, и COMMANDER_VIDEO будет равен "%POT_PLAYER%". А запись:
Code:
SetEnv COMMANDER_VIDEO %"SoftVideo"

Раскрывает, и тогда COMMANDER_VIDEO содержит в себе полный путь к PotPlayerMini.exe, что и требуется в одной задаче.
Loopback wrote:
Мне кажется странной идея считать систему русской, если она не английская

А мне другого и не нужно Very Happy Делать многоязычную поддержку планов нет, просто заметил, что при минимальных усилиях можно учесть в коде английский UI, добавив условие к:
Code:
param.SetStr("Security" & Chr(0))
param.SetStr("Безопасность" & Chr(0))

То же самое относится и к строке поиска окна выбора цвета, где предусмотрен только русский вариант:
Code:
h = WinFind(0, "#32770", "Цвет")


А что касается релиза, то пока всё работает, но завтра я буду больше тестировать, тогда и посмотрим. Но надо сказать, что такими темпами, скоро и AutoHotkey будет не нужен Very Happy
Back to top
View user's profile Send private message
Orion9



Joined: 01 Jan 2024
Posts: 716

Post (Separately) Posted: Wed Mar 05, 2025 18:14    Post subject: Reply with quote

Проиграть звук в Autorun? Да без проблем! Very Happy

Code:
file = "C:\Windows\Media\tada.wav"
DllCall("Winmm.dll\PlaySoundW", "wstr", file,  "ptr", 0, "dword", 131072 + 1)


Loopback, пока не поставил в конце имени PlaySoundW, функция не хотела работать, хотя в справке говорится, что такая подстановка должна происходить автоматически. Уже второй раз замечаю.

Решил переделать тёмный хинт под новые параметры задержки:
Code:
Func ShowDarkHint(DarkHint, Delay = 0, Flags = 0)
    # формат подсказки
    SetHintParam("ShowHint", "Font", 10, "Arial")
    SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
    SetHintParam("ShowHint", "Text", 0xFFFFFF)   
    # отображение подсказки
    ShowHint(DarkHint, "", "", Delay, Flags)
    # возвращение формата по умолчанию
    Sleep(50)
    SetHintParam("ShowHint", "Reload")   
EndFunc

Поскольку у этой функции два необязательных параметра на конце, не будет ли каких проблем с простым вызовом вроде ShowDarkHint("Текст"), или лучше указывать хотя бы один параметр, т.е. ShowDarkHint("Текст", 0)?

Раньше у меня был второй вариант.
Back to top
View user's profile Send private message
Loopback



Joined: 07 Sep 2009
Posts: 1483

Post (Separately) Posted: Wed Mar 05, 2025 21:32    Post subject: Reply with quote

Orion9 wrote:
хотя в справке говорится, что такая подстановка должна происходить автоматически

В справке говорится, что если

Quote:
...такой функции не окажется в перечисленных выше библиотеках, будет произведена попытка...

Т.е. схема применяется только к перечисленному списку, winmm.dll в нем отсутствует.

С другой стороны, получение адреса не сильно ресурсоемкая операция, наверно, можно распространить и на другие библиотеки. Но в любом случае лучше использовать суффикс W явно, будет чуть-чуть, но быстрее.

Orion9 wrote:
Поскольку у этой функции два необязательных параметра на конце, не будет ли каких проблем с простым вызовом вроде ShowDarkHint("Текст"), или лучше указывать хотя бы один параметр, т.е. ShowDarkHint("Текст", 0)?

С чего бы им быть? Параметры со значением по умолчанию для таких задач и предназначены.
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 ... 175, 176, 177 ... 184, 185, 186  Next
Page 176 of 186

 
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