Orion9

|
Posted: Thu Jan 09, 2025 13:26 Post subject: |
|
|
Avada, Спасибо за ответ. В чём-то могу согласиться, но все-таки это больше похоже на недоработку. Возможно, Гислеру об этом не говорили, но команда cm_ReloadFileIcons должна перечитывать секцию прежде, чем перечитывать иконки, тогда она будет работать правильно. Вообще, давно заметил, что Тоталу не хватает команды, которая будет сохранять и перечитывать всю кофигурацию, как это происходит при начальной загрузке, это бы во многом облегчило жизнь. А что касается внутренних ассоциаций, то теперь остается только одно - вызывать окно командой cm_InternalAssociate и "прожимать" ОК, как это и было сделано в старых версиях TCASwitcher. Окно, конечно, мелькает, но зато работает все как надо.
В принципе, я так и сделал, но немного оптимизировал алгоритм: если при запуске ассоциации включены (секция наполнена), то cm_InternalAssociate не посылается, и все работает сверх-гладко, просто глаз радуется. Если же секция была пустой (ассоциации были отключены), то сначала вызывается окно внутренних ассоциаций, нажимается ОК, и только потом обновляется значок на панели. Окно при этом мелькает, но это мелочи.
 autorun.cfg Code: | Global IniAssocState
# первое выполнение при запуске
IniAssocState = AssocState()
Func AssocState()
Local f1, res
IniRead /R f1 %COMMANDER_INI% "Associations" "Filter1" ""
# если в секции что-то есть, значит она включена
If f1 <> "" Then
SetEnv TEST_ICON "%COMMANDER_PATH%\Icons\Clsw\2.ico"
res = true
Else
SetEnv TEST_ICON "%COMMANDER_PATH%\Icons\Clsw\6.ico"
res = false
Endif
Return res
EndFunc
Func SwitchAssocState(lParam)
Local script = %COMMANDER_PATH% & "\Scripts\Vbs\ChangeAssoc.vbs", sect
If AssocState() Then
# отключение секции
sect = '[-Associations]'
Else
# включение секции
sect = '[+Associations]'
Endif
ShellExec /SW_HIDE /WAIT:3000 '%windir%\system32\cscript.exe' '"%script%" "%sect%"'
AssocState()
If IniAssocState Then
AssocUpdateWin(true)
Else
RunThread AssocWinSynс
EndIf
EndFunc
Func AssocWinSynс()
Local h = 0, i
PostMessage(AUTORUN_TCHANDLE, 0x433, 519)
# ожидание появления окна
For i = 1 To 75
h = WinFind(0, "TDlgCustomColors")
If h > 0 Then Break
Sleep(25)
#OutputDebugString(h)
Next
If h > 0 Then
b = WinFind(h, "TButton", 3)
SendMessage(b, 0xF5, 0, 0)
Else
ShowHint("Окно не найдено")
Return
Endif
AssocUpdateWin(false)
EndFunc
Func AssocUpdateWin(lReload)
SendMessage(AUTORUN_TCHANDLE, 11, 0, 0)
If lReload Then SendCommand cm_ReloadFileIcons
SendCommand cm_ReloadBarIcons
sleep(10)
SendMessage(AUTORUN_TCHANDLE, 11, 1, 0)
WinRedraw(1)
EndFunc
|
AkulaBig wrote: | Дак мне переключение ассоциаций не надо, поэтому я и не делал |
Так ведь дело не только в ассоциациях: ваш скрипт к чему угодно можно применить, вы только добавьте ему универсальности, чтобы можно было управлять именем файла и секциями через параметры, а не созданием повторных экземпляров. Вам же самому пригодится, если будете делать [DirMenu] по тому же принципу.
AkulaBig wrote: | Для переключения ассоциаций есть готовые скрипты, программа. Вроде достаточно инструментов. |
Это да. Но на Autorun-то еще не было, да еще и в таком коллабе  |
|