Orion9

|
Posted: Fri May 15, 2026 12:19 Post subject: |
|
|
Не ждали через 5 лет? А тем временем появилось более современное и интегрированное решение данной задачи.
Спасибо пользователю lz57005 за отлов нужных сообщений. Именно благодаря этим сообщениям переключение ассоциаций происходит очень гладко.
Пример из справки плагина Autorun:
 Hidden text | Code: | # Автор — 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 |
Установка и настройка плагина имеет ряд особенностей и выходит за рамки топика. Что касается последней версии, то
К скрипту из справки можно добавить функцию для гладкого переключения иконки на панели инструментов. Создается переменная окружения, которая сохраняет путь к иконке в зависимости от состояния секции в ini. Эта переменная окружения прописывается в кнопку в качестве иконки. Пример функции
| Code: | 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() должна быть один раз вызвана для инициализации текущего состояния. После переключения она вызвается еще раз с посылкой всех сообщений и перерисовкой экрана.
| Code: | 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) |
Иконка переключается очень гладко, практически как родная иконка ТС. Отдельный тест переключения иконки
| Code: | 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 |
| Code: | TOTALCMD#BAR#DATA
61002
%ICON_TEST%
Тест переключения иконки
1
-1
|
|
|