Кнопка вкл\выкл "внутренние ассоциации"

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

lz57005
...А ваше сообщение, являясь дублем этого, нарушает правила форума. Дублировать информацию не надо ни в разных подфорумах, ни в одном. Про заглавные буквы и точки в правилах тоже говорится. Получите замечание по совокупности достижений.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Не ждали через 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
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Забыл написать, может кому-то пригодится.

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

Код: Выделить всё

SetHotkeyAction /K:W /H:ENTER /S "RunThread" "LaunchBySystem"

Func LaunchBySystem()
    Local sFile = RequestCopyDataInfo("SP") & RequestCopyDataInfo("SN")
    If Not FileExist(sFile) Then 
       ShowHint("Файл не существует " & sFile)
       Return
    EndIf
    ShellExec("explorer.exe", sFile)
EndFunc
Вроде удобно
Ответить