Не ждали через 5 лет?

А тем временем появилось более современное и интегрированное решение данной задачи.
Спасибо пользователю
lz57005 за отлов нужных сообщений. Именно благодаря этим сообщениям переключение ассоциаций происходит очень гладко.
Пример из справки плагина Autorun:
[cut]
Код: Выделить всё
# Автор — Flasher
# Включение/отключение внутренних ассоциаций
RegisterCommand 64000 SwitchInternalAssociations
Func SwitchInternalAssociations(lParam)
Local oIni = TextFile(COMMANDER_INI), Enc = oIni.Encoding, i, Str1, Str2, _
Pos1, Pos2, x = 15, Text, FSize = FileGetSize(COMMANDER_INI), Mess
Free(oIni)
oIni = BinaryFile(COMMANDER_INI, 'rw-d')
While oIni.Pos < FSize
i += 15
Str1 = oIni.ReadStr(15, Enc)
Pos1 = StrPos(Str2 & Str1, '[Associations]')
Pos2 = StrPos(Str2 & Str1, '[-Associations]')
If Str2 <> '' Then x = 30
If Pos1 Then
oIni.Pos = 0
Text = oIni.ReadStr(i - x + Pos1, Enc) & '-' & oIni.ReadStr(0, Enc)
oIni.Pos = 0
oIni.WriteStr(Text, 0, Enc)
Free(oIni)
Mess = 'ОТКЛЮЧЕНЫ!'
Break
ElseIf Pos2 Then
oIni.Pos = 0
Text = oIni.ReadStr(i - x + Pos2, Enc)
oIni.Seek(1, 1)
Text = Text & oIni.ReadStr(0, Enc)
Free(oIni)
FileWrite(COMMANDER_INI, Text, Enc)
Mess = 'ВКЛЮЧЕНЫ!'
Break
EndIf
Str2 = Str1
Wend
Static aCounter
aCounter += 1
If Mess = '' Then
Mess = 'ОТСУТСТВУЮТ!'
Else
PostMessage(AUTORUN_TCHANDLE, 147, 0, 1302100)
If aCounter = 1 And Mess = 'ВКЛЮЧЕНЫ!' Then
PostMessage(AUTORUN_TCHANDLE, 1045)
Else
SendCommand(2958)
EndIf
EndIf
ShowHint('Внутренние ассоциации ' & Mess, -1000, -1000, 1500, 1)
WinAlign(LAST_HINT_WINDOW, 0, RequestInfo(3), 0)
EndFunc
[/cut]
Установка и настройка плагина имеет ряд особенностей и выходит за рамки топика. Что касается последней версии, то
[cut]На данный момент это 2.2.21.3 (15.10.2025)
Инструкция по установке плагина
https://total.darkhost.ru/wiki/doku.php?id=ru:autorun
Особенности последней версии. Для версии 2.2.21.3 нет полного архива с дополнительными модулями (субплагинами) и файлами справки, установку придется проводить в два этапа. Сначала нужно установить версию 2.2.21 от 28.09.2025
https://total.darkhost.ru/files/autorun ... 1_beta.zip
Поверх неё накатить последний модуль от 15.10.2025
https://total.darkhost.ru/files/temp/au ... 251015.zip[/cut]
К скрипту из справки можно добавить функцию для гладкого переключения иконки на панели инструментов. Создается переменная окружения, которая сохраняет путь к иконке в зависимости от состояния секции в ini. Эта переменная окружения прописывается в кнопку в качестве иконки. Пример функции
Код: Выделить всё
Func AssocState()
Local flt
IniRead /R flt %COMMANDER_INI% "Associations" "Filter1" ""
# секция включена
If flt <> "" Then
SetEnv ICON_ASSOC "%COMMANDER_PATH%\Icons\Assoc\1.ico"
Return true
Endif
# секция выключена
SetEnv ICON_ASSOC "%COMMANDER_PATH%\Icons\Assoc\2.ico"
Return false
EndFunc
При старте ТС функция AssocState() должна быть один раз вызвана для инициализации текущего состояния. После переключения она вызвается еще раз с посылкой всех сообщений и перерисовкой экрана.
Код: Выделить всё
AssocState()
SendMessage(AUTORUN_TCHANDLE, 11, 0, 0)
SendMessage(AUTORUN_TCHANDLE, 1045, 0, 0)
SendCommand cm_ReloadBarIcons
Sleep(10)
SendMessage(AUTORUN_TCHANDLE, 11, 1, 0)
WinRedraw(1)
Иконка переключается очень гладко, практически как родная иконка ТС. Отдельный тест переключения иконки
Код: Выделить всё
RegisterCommand 61002 "SwitchTestIcon"
SetEnv ICON_TEST "%COMMANDER_PATH%\Icons\Test\1.ico"
Func SwitchTestIcon()
Static c = false
c = (c = false ? true : false)
If c Then
# действия при включении
SetEnv ICON_TEST "%COMMANDER_PATH%\Icons\Test\1.ico"
Else
# действия при выключении
SetEnv ICON_TEST "%COMMANDER_PATH%\Icons\Test\2.ico"
Endif
SendMessage(AUTORUN_TCHANDLE, 11, 0, 0)
SendCommand 2945 # cm_ReloadBarIcons
Sleep(10)
SendMessage(AUTORUN_TCHANDLE, 11, 1, 0)
WinRedraw(1)
EndFunc
Код: Выделить всё
TOTALCMD#BAR#DATA
61002
%ICON_TEST%
Тест переключения иконки
1
-1