Autorun

Обсуждение только плагинов и утилит для Total Commander.

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

AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Loopback писал(а):Версия Autorun 2.2.16
Столько полезных изменений. Спасибо, будем тестить.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Loopback писал(а):Ввиду большого объема внутренних изменений могут возникнуть неожиданные проблемы в любой функции, так что при необходимости будут выпущены хотфиксы.
Проблемы действительно возникли, пришлось разбираться. Пока всё запустилось, но чтобы и другое всё проверить, потребуется больше времени.

DllCall - это, конечно, круто. Ещё бы уметь им пользоваться :D

Можете посмотреть, что не так в этом коде:
[cut]

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

Func FileSecInfo(lParam)
    Static SEE_MASK_INVOKEIDLIST = 0x0000000C, _
           LPSHELLEXECUTEINFO = 60, _
           SW_SHOWNORMAL = 1
           SW_SHOW = 5
           
    Local p = RequestCopyDataInfo("SP")
    Local n = RequestCopyDataInfo("SN")
    Local f = p & n        
    Local buff = Buffer(LPSHELLEXECUTEINFO) , verb = Buffer(10*2+2), file = Buffer(StrLen(f)*2+2), parm = Buffer(12*2+2)
    
    verb.SetStr("properties" & Chr(0))
    file.SetStr(f & Chr(0))
    #parm.SetStr("Security" & Chr(0))
    parm.SetStr("Безопасность" & Chr(0))    

    buff.SetNum(0, "dword", buff.size, _   
                  "ulong", SEE_MASK_INVOKEIDLIST, _          
                  "ptr",  0, _
                  "ptr", verb.Ptr, _
                  "ptr", file.Ptr, _
                  "ptr", parm.Ptr, _
                  "ptr", 0, _
                  "int",  1)
    DllCall("shell32\ShellExecuteExW", "ptr", buff.Ptr)
    Free(buff, verb, file, parm)
EndFunc
[/cut]
Вроде всё работает, но иногда спотыкается, а иногда и ТС валит.

Ну и с новыми функциями сам Гислер велел:
[cut]

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

# внутренние ассоциации
Global AssocIniState = AssocState()

Func AssocState()
    Local flt
    IniRead /R flt %COMMANDER_INI% "Associations" "Filter1" ""
    # секция включена
    If flt <> "" Then
       SetEnv ICON_ASSOC "%COMMANDER_PATH%\Icons\Clsw\2.ico"
       Return true
    Endif
    # секция выключена    
    SetEnv ICON_ASSOC "%COMMANDER_PATH%\Icons\Clsw\6.ico"
    Return false
EndFunc

Func SwitchAssocState(lParam)
    Local ini = %COMMANDER_PATH% & "\Ini\Associations.ini"
    Local script = %COMMANDER_PATH% & "\Scripts\Vbs\ChangeAssoc.vbs", sect, vbs = false
    If AssocState() Then
       # отключение секции
       sect = '[-Associations]'
       If vbs = false Then IniRenameSection(ini, "Associations", "-Associations")
    Else
       # включение секции   
       sect = '[+Associations]' 
       If vbs = false Then IniRenameSection(ini, "-Associations", "Associations")       
    Endif
    If vbs = true Then ShellExec /SW_HIDE /WAIT:3000 "%script%" "%sect%"   
    AssocState()
    If AssocIniState Then
       AssocUpdateWin(true)
    Else
       RunThread AssocWinSynс
    EndIf   
EndFunc

Func AssocWinSynс()
    Local b, i, h = 0
    PostMessage(AUTORUN_TCHANDLE, 0x433, 519)
    # ожидание окна 
    For i = 1 To 75
        h = WinFind(0, "TDlgCustomColors")
        If h > 0 Then Break   
        Sleep(20)
    Next
    If h > 0 Then   
       b = WinFind(h, (AUTORUN_TCARCH = 32 ? "TButton" : "Button"), (AUTORUN_TCARCH = 32 ? 3 : 2))
       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
[/cut]
Совместимость с vbs-скриптом сохранена.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):чтобы и другое всё проверить, потребуется больше времени.
Я уже переделал на обновленный TCLANG.
Только что написал новый скрипт на Autorun для переключения секций. Пришлось в инишник добавлять еще одну секцию. Но по другому никак. На нынешний момент Buttonbar.ini переделан. Завтра добью.
Orion9 писал(а):# внутренние ассоциации
Я сначала применил вашу функцию, но потом увидел, что вы еще один процесс запускает. Я так понял у вас эта функция для тестирования. Мне-то пришлось ее полностью переделать. А завтра на новый алгоритм переделаю. И в справке приведен пример с ассоциациями с использованием нового функционала. Но и ваш вариант у меня полностью работал.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Orion9 писал(а):Вроде всё работает, но иногда спотыкается, а иногда и ТС валит.
Есть две очевидные проблемы:
- память структуры нужно обнулять после создания, если явно не устанавливаются все её члены, иначе там окажется случайный мусор;
- размер структуры 60 - это для 32-битной версии, в x64 должен быть 112.

Как-то так:
[cut]

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

Func FileSecInfo(lParam)
    Static SEE_MASK_INVOKEIDLIST = 0x0000000C, _
           LPSHELLEXECUTEINFO = (auX64 ? 112 : 60) , _
           SW_SHOWNORMAL = 1
           SW_SHOW = 5
           
    Local p = RequestCopyDataInfo("SP")
    Local n = RequestCopyDataInfo("SN")
    Local f = p & n       
    Local buff = Buffer(LPSHELLEXECUTEINFO), verb = Buffer(10*2+2), file = Buffer(StrLen(f)*2+2), parm = Buffer(12*2+2)
    buff.Zero() # обнуляем память
   
    verb.SetStr("properties" & Chr(0))
    file.SetStr(f & Chr(0))
    #parm.SetStr("Security" & Chr(0))
    parm.SetStr("Безопасность" & Chr(0))   

    buff.SetNum(0, "dword", buff.size, _   
                  "ulong", SEE_MASK_INVOKEIDLIST, _         
                  "ptr",  0, _
                  "ptr", verb.Ptr, _
                  "ptr", file.Ptr, _
                  "ptr", parm.Ptr, _
                  "ptr", 0, _
                  "int",  1)
    DllCall("shell32\ShellExecuteExW", "ptr", buff.Ptr)
    Free(buff, verb, file, parm)
EndFunc
[/cut]
Orion9 писал(а):Ну и с новыми функциями сам Гислер велел:
В подразделе "Конфигурация TC" справочных примеров Flasher добавил пример на эту тему, гляньте, может пригодится.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Утро, кофе, и нешвейцарский шоколад:

[cut]

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

Global DirSounds  = %COMMANDER_PATH% & "\Ini\Sounds"

RunThread ThreadSounds

Func ThreadSounds
    Local debg = 1, key, val
    Local ini = DirSounds & "Sounds.ini", out, i
        
    If Not FileExist(ini) Then      
       MsgBox("Не найден " & ini)
       Return
    Endif
    
    ProcessExecGetOutput /OEM out %COMSPEC% "/c dir /s /b *.wav" %DirSounds%
    
    Local aWav = List()
    aWav.Text = out
    Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
                            "WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")    
    While 1        
        For i = 0 To aNames.Count - 1
           val = aWav[Random(0, aWav.Count-1, 1)]        
           key = "HKCU\AppEvents\Schemes\Apps\Wincmd" & aNames[i] & "\.current"
           RegWrite(key, "", "REG_SZ", val)
           If debg Then      
              OutputDebugString("Autorun: key = " & key)
              OutputDebugString("Autorun: val = " & val)              
           EndIf           
        Next
        Sleep(1000) 
    Wend
    Free(aNames, aWav)
EndFunc
[/cut]
Вот теперь ближе к тому, как оно должно быть, и это ещё не предел. Чтобы выжать максимум, список нужно дополнительно фильтровать и предварительно назначить на каждую операцию свой подкаталог с рамдомными файлами. Секция в ini может выглядеть так:

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

[Random]
Enable=1
Interval=10000
Debug=1
...
WincmdCopyComplete=Chewbacca
WincmdDeleteComplete=Операция Ы
...
Когда услышал звуки Чубаки чуть под стол не закатился. Однозначно рекомендую.
Loopback писал(а):Есть две очевидные проблемы:
Теперь всё работает :) Для таких дел, разумеется, совсем другой объем знаний требуется. Было бы хорошо пару статеек почитать для начала: найдутся хорошие материалы?
Loopback писал(а):В подразделе "Конфигурация TC" справочных примеров Flasher добавил пример на эту тему, гляньте, может пригодится.
Пригодится-то он пригодится, но сам пример не до конца рабочий. Ранее я уже писал, чем обусловлен вызов окна ассоциаций, вот и автор TCASwitcher тоже был вынужден откатится к тому же и всё по той же причине:
[cut]TCASwitcher - программа для переключения внутренних файловых ассоциаций Total Commander >=10.50 с возможностью задать наборы программ для открытия файлов в зависимости от их расширения

История изменений:
1.1.7
Исправлено переключение ассоциаций, когда при запуске Total Commander была включена "красная" секция (без ассоциаций). Правда, для этого пришлось вернуть одно из двух мелькающих окон, которые были убраны в версии 1.1.5[/cut]
Я был бы рад отказаться от вызова окна, но пока Ghisler не исправит этот косяк, видимо, не получится. Однако если у вас есть какие-то предложения, буду рад услышать!
AkulaBig писал(а):но потом увидел, что вы еще один процесс запускает. Я так понял у вас эта функция для тестирования.
Нет, функция больше не для тестирования, даже успел имя переменной окружения поменять с %ICON_TEST% на %ICON_ASSOC% :) А по поводу окна написал выше (если вы имеете в виду строку RunThread AssocWinSynс).

AkulaBig
Кстати, забыл написать. Последнюю сборку ещё не скачивал, но в той, что у меня есть, не вижу хайлайтера от yozhic в AkelPad-е. Вы им не пользуютесь? Имхо, многое теряеете.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а): по поводу окна написал выше (если вы имеете в виду строку RunThread AssocWinSynс).
Не совсем понял, при чем тут TCASwitcher. У меня вроде нет проблем при запуске с отключенными ассоциациями.
[cut]
Orion9 писал(а):не вижу хайлайтера от yozhic в AkelPad-е.
Еще-бы понять, про что вы.[/cut]
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

Чтобы не откладывать в дальний ящик:

[cut="Sounds.ini"]

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

[Random]
Enable=1
Interval=5000
Debug=1
WincmdConnected=*
WincmdCopyComplete=Alisa1
WincmdDeleteComplete=Chewbacca
WincmdPackComplete=Операция Ы
WincmdSearchComplete=Random\Search
WincmdTransferComplete=Archer
WincmdUnpackComplete=**

[EventLabels]
Wincmd=Total Commander
WincmdConnected=FTP-соединение установлено
WincmdCopyComplete=Копирование/перемещение завершено
WincmdDeleteComplete=Удаление завершено
WincmdPackComplete=Упаковка завершена
WincmdSearchComplete=Поиск завершён
WincmdTransferComplete=Передача завершена
WincmdUnpackComplete=Распаковка завершена

[Schemes1]
Name=Алиса #1
Folder=Alisa1
Description=Алиса знает, что делать! #1
WincmdConnected=Соединение.wav
WincmdCopyComplete=Копирование.wav
WincmdDeleteComplete=Удаление.wav
WincmdPackComplete=Упаковка.wav
WincmdSearchComplete=Поиск.wav
WincmdTransferComplete=Передача.wav
WincmdUnpackComplete=Распаковка.wav

[Schemes2]
Name=Алиса #2
Folder=Alisa2
Description=Алиса знает, что делать! #2
WincmdConnected=Соединение.wav
WincmdCopyComplete=Копирование.wav
WincmdDeleteComplete=Удаление.wav
WincmdPackComplete=Упаковка.wav
WincmdSearchComplete=Поиск.wav
WincmdTransferComplete=Передача.wav
WincmdUnpackComplete=Распаковка.wav

[Schemes3]
Name=Archer
Folder=Archer
Description=Archer
WincmdConnected=TC Connected To FTP.wav
WincmdCopyComplete=TC Operation Complete.wav
WincmdDeleteComplete=TC Delete Complete.wav
WincmdPackComplete=TC Pack Complete.wav
WincmdSearchComplete=TC Search Complete.wav
WincmdTransferComplete=TC Transfer Complete.wav
WincmdUnpackComplete=TC Unpack Complete.wav

[Schemes4]
Name=Операция Ы
Folder=Операция Ы
Description=Операция Ы
WincmdConnected=Со взломом или без.wav
WincmdCopyComplete=Мелкое хулиганство - крупные деньги.wav
WincmdDeleteComplete=Пол-литра вдребезги.wav
WincmdPackComplete=Сворачивайтесь - есть дело.wav
WincmdSearchComplete=Где бабуля - я за неё.wav
WincmdTransferComplete=Всё уже украдено до нас.wav
WincmdUnpackComplete=Расхититель соцсобственности.wav
[/cut]
[cut=".aucfg"]

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

RunThread ThreadSoundsAdvanced

Func ThreadSoundsAdvanced()
    Local rand = 1, debg = 1, intv, key, val
    Local ini = DirSounds & "Sounds.ini", out, i
        
    If Not FileExist(ini) Then      
       MsgBox("Не найден " & ini)
       Return
    Endif

    IniRead rand %ini% "Random" "Enable" 0    
    IniRead intv %ini% "Random" "Interval" 3000
    IniRead debg %ini% "Random" "Debug" 0
    
    If Not rand Then Return    
    If Not IsInt(intv) Or intv < 1000 Then intv = 1000
    
    ProcessExecGetOutput /OEM out %COMSPEC% "/c dir /s /b *.wav" %DirSounds%
    
    Local aWav = List()
    aWav.Text = out
    If aWav.Count = 0 Or Not StrPos(aWav[0], ".wav") Then
       MsgBox("Не найдены звуковые файлы *.wav в каталоге " & DirSounds)
       Return
    Endif
    
    Local aNames = List("WincmdConnected","WincmdCopyComplete","WincmdDeleteComplete","WincmdPackComplete", _
                            "WincmdSearchComplete","WincmdTransferComplete","WincmdUnpackComplete")    
                            
    Local aVal = List(), aPos = List(), aEnd = List()
    For i = 0 To aNames.Count-1
        key = aNames[i]
        IniRead val %ini% "Random" %"%key%" "*"
        aVal.Add(val)
        If val = "*" Then
           aPos.Add(-1)
           aEnd.Add(-1)
        ElseIf val = "**" Then
           aPos.Add(0)
           aEnd.Add(aWav.Count-1)        
        Else 
           Local dir = "" & val & "", found = false
           For j = 0 To aWav.Count-1
               If StrPos(aWav[j], dir) Then 
                  found = true
                  Break
               EndIf   
           Next
           If Not found Then j = -1           
           pos = j
           aPos.Add(pos)
           If pos > -1 Then 
              For j = pos To aWav.Count-1
                  If Not StrPos(aWav[j], dir) Then Break
              Next
              If j < aWav.Count-1 Then j = j - 1
              aEnd.Add(j)              
           Else
              aEnd.Add(-1)
           EndIf
        EndIf    
    Next
    
    If debg Then
       OutputDebugString("Autorun: aWav = " & aWav.Text)
       OutputDebugString("Autorun: aVal = " & aVal.Text)       
       OutputDebugString("Autorun: aPos = " & aPos.Text)
       OutputDebugString("Autorun: aEnd = " & aEnd.Text)        
    EndIf
            
    While 1        
        For i = 0 To aNames.Count - 1
           If aPos[i] = -1 Then Continue
           val = aWav[Random(aPos[i], aEnd[i], 1)]        
           key = "HKCU\AppEvents\Schemes\Apps\Wincmd" & aNames[i] & "\.current"
           RegWrite(key, "", "REG_SZ", val)
           If debg Then      
              OutputDebugString("Autorun: key = " & key)
              OutputDebugString("Autorun: val = " & val)              
           EndIf           
        Next
        Sleep(intv)
    Wend
    Free(aNames, aWav, aVal, aPos, aEnd)
EndFunc
[/cut]

На каждое событие можно указать отдельный каталог с wav-файлами. Файлы из этого каталога будут проигрываться в случайном порядке только для данного события. Одиночная звёздочка - игнорировать событие. Двойная звёздочка - проигрывать все (*.wav ) файлы для данного события из корневого каталога, включая подкаталоги.

По задумке, нужно создать отдельный каталог типа "Random" (чтобы не трогать существующие каталоги звуковых схем), который будет содержать подкаталоги с именами Copy, Delete, Pack, Search и т.д. В этих подкаталогах можно собирать любые wav-файлы, которые нравятся и не надоедают, и далее использовать для озвучки нужных событий.

Поскольку готовой коллекции wav-файлов у меня пока нет, за основу были взяты файлы из сборки AkulaBig + Чубака (первая версия Copilot, которая не умела говорить, но всё понимала :mrgreen:), но можно использовать любые wav-файлы, даже не регистрируя звуковые схемы. Первый простой алгоритм постом выше для этого подойдет. Второй алгоритм уже завязан на ini-файл и его опции. Серьёзных проверок нет: если файлы отсутствуют, они просто не будут проигрываться или меняться в случайном порядке.
AkulaBig писал(а):У меня вроде нет проблем при запуске с отключенными ассоциациями.
Повезло. А у меня не работает, в том плане, что значки на панелях не меняются, если при старте ТС внутренние ассоциации были выключены.
AkulaBig писал(а):Еще-бы понять, про что вы.
Про эту подсветку к файлам Autorun.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):значки на панелях не меняются, если при старте ТС внутренние ассоциации были выключены
Теперь понял. Да, у меня так-же. TCASwitcher у меня простоял совсем немного времени и я с ним не разбирался. Поэтому не понял вашего намека.
Orion9 писал(а):RunThread AssocWinSynс
Я имею ввиду, что второй поток это слишком. Буду пытаться запихать его в общий поток.
[cut]
Orion9 писал(а):Про эту подсветку к файлам Autorun.
Теперь понял. Вы просто змей-искуситель :lol: У меня сборка ежика есть. Скопировал оттуда. Заодно увидел еще пару полезных подсветок. Но пришлось там кое-что подправить. В итоге пару-тройку часов на ветер :twisted:
Предлагаю весь флуд помещать под кат. Это будет правильно.[/cut]

Добавлено спустя 2 часа 36 минут:

Orion9
У меня ваш скрипт ассоциаций срабатывает только после команды cm_ReloadFileIcons. Я имею ввиду при отключенных ассоциациях. После перезагрузки. Причем не важно, используешь внешний скрипт или новый алгоритм с скриптом Autorun.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Ну вот так все отлично работает. Теперь надо разобраться, как ShellExec "%COMMANDER_PATH%\Utilities\TCFS2\TCFS2.exe" '/ef "msg(147,0,1302100) msg(1045,0,0)' переписать на Autorun и можно пользоваться.

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

# Переключение ассоциаций файлов
# Switching file associations
RegisterCommand 61000 "SwitchAssocState"

Global AssocIniState
# первое выполнение при запуске
# first execution when launching
AssocIniState = AssocState()

Func AssocState()
	Local flt
	IniRead /R flt %COMMANDER_INI% "Associations" "Filter1" ""
	# если в секции что-то есть, значит она включена
	# if there is something in section, then it is turned on
	If flt <> "" Then
		SetEnv AssocIco "%COMMANDER_PATH%\Images\Others\ICO\Light\LightOn.ico"
		Return true
	Else
		SetEnv AssocIco "%COMMANDER_PATH%\Images\Others\ICO\Light\LightOff.ico"
		Return false
	Endif
EndFunc

Func SwitchAssocState(lParam)
	Local ini_Assoc = %COMMANDER_PATH% & "\Ini\Associations.ini"

	Local Sections = List()
	Sections.Text = IniReadSectionNames(%ini_Assoc%)

	If Sections.IndexOf('Associations') > -1 Then
		IniRenameSection(%ini_Assoc%, 'Associations', '-Associations')
	ElseIf Sections.IndexOf('-Associations') > -1 Then
		IniRenameSection(%ini_Assoc%, '-Associations', 'Associations')
	EndIf

	Free(Sections)

	AssocState()

	CommandExec cm_ReloadBarIcons
	
	# Обновляем иконки ассоциированных файлов
	# Update icons of associated files
	ShellExec "%COMMANDER_PATH%\Utilities\TCFS2\TCFS2.exe" '/ef "msg(147,0,1302100) msg(1045,0,0)'
EndFunc
Добавлено спустя 1 час 48 минут:

Ну все, пишем вместо ShellExec "%COMMANDER_PATH%\Utilities\TCFS2\TCFS2.exe" '/ef "msg(147,0,1302100) msg(1045,0,0)':

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

CommandExec cm_ReloadBarIcons
# Обновление внутренних ассоциаций
# Updating internal associations
SendMessage(AUTORUN_TCHANDLE, 1045,0,0)
и все отлично работает. Обратите внимание, что CommandExec cm_ReloadBarIcons после AssocState() не лишний. Иначе будет открываться окно настройки ассоциаций.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig
Ну что тут сказать? Теперь я точно знаю, как я буду дальше жить:
[cut]График переключения ассоциаций с окном неправильный, график переключения ассоциаций без окна - верный :mrgreen:
https://www.youtube.com/watch?v=W7XNwwCz99k[/cut]
Спасибо за наводку. Переделал под себя:
[cut]

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

# внутренние ассоциации
Global AssocIniState = AssocState()

Func AssocState()
    Local flt
    IniRead /R flt %COMMANDER_INI% "Associations" "Filter1" ""
    # секция включена
    If flt <> "" Then
       SetEnv ICON_ASSOC "%COMMANDER_PATH%\Icons\Clsw\2.ico"
       Return true
    Endif
    # секция выключена    
    SetEnv ICON_ASSOC "%COMMANDER_PATH%\Icons\Clsw\6.ico"
    Return false
EndFunc

Func SwitchAssocState(lParam)
    Local ini = %COMMANDER_PATH% & "\Ini\Associations.ini"
    Local script = %COMMANDER_PATH% & "\Scripts\Vbs\ChangeAssoc.vbs", sect, vbs = false
    If AssocState() Then
       # отключение секции
       sect = '[-Associations]'
       If vbs = false Then IniRenameSection(ini, "Associations", "-Associations")
    Else
       # включение секции   
       sect = '[+Associations]' 
       If vbs = false Then IniRenameSection(ini, "-Associations", "Associations")       
    Endif
    If vbs = true Then ShellExec /SW_HIDE /WAIT:3000 "%script%" "%sect%"
    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)       
EndFunc
[/cut]
Vbs-скрипт оставлен как альтернативный вариант, поскольку ограничение в 32767 символа у IniRenameSection не такое уж и недостижимое.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):ограничение в 32767 символа у IniRenameSection не такое уж и недостижимое.
А применение List() не решит проблему? Я пытался сделать через List.Text, но ничего не получилось, так как при командной записи Autorun ругается, что ему нужна переменная нормального формата. А без командной записи никак.
Orion9 писал(а):Vbs-скрипт оставлен как альтернативный вариант
А я просто сборку с внешними скриптами забекапил. Потому что второй раз разобраться с кавычками не реально :)
Orion9 писал(а):SendMessage(AUTORUN_TCHANDLE, 1045, 0, 0)
А вы не подскажите, что это за команда? Пробовал ее заменить на cm_InternalAssociate. Не прокатывает. Но если cm_ReloadBarIcons использовать только один раз, окно ассоциаций появляется.
В скриптах для Акельки хорошее правило применяется. Рядом с цифирками обозначение пишут.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):но ничего не получилось
А я ничего не понял ) Ну, может быть Loopback чего подскажет.
AkulaBig писал(а):А вы не подскажите, что это за команда? Пробовал ее заменить на cm_InternalAssociate. Не прокатывает.
Я так глубоко в систему не лезу. На такие вопросы могут ответить разве что системные разработчики, типа Loopback, либо те, кто давно и плотно сидит в теме автоматизации, типа Flasher. Как я уже говорил, присутствие второго на форуме не помешало бы, но увы - пять лет назад не поделили что-то с админом, а простой народ теперь страдает.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):А я ничего не понял
Вот мой скрипт переключения секций:

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

Func SwitchIniSect(sIni, sSectSource, sSectTarget)
	IniReadSection SwitchSect %"%sIni%" %"%sSectSource%"
	IniWriteSection %"%sIni%" %"%sSectTarget%" %"%SwitchSect%"
EndFunc
А хотелось-бы:

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

Func SwitchIniSect(sIni, sSectSource, sSectTarget)
	Local SwitchSect = List()
	IniReadSection SwitchSect.Text %"%sIni%" %"%sSectSource%"
	IniWriteSection %"%sIni%" %"%sSectTarget%" %"%SwitchSect.Text%"
EndFunc
Но не работает так. Мне кажется, что при использовании массива длина секции намного увеличивается. Хотя может я и не прав.
Loopback
Можете прокомментировать мой вопрос?
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

AkulaBig писал(а):А вы не подскажите, что это за команда?
Первоначально на форуме здесь упоминалась...
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

sa писал(а):Первоначально на форуме здесь упоминалась...
Оттуда я ее и взял. Поиском нашел. Хотелось-бы узнать, что это за команда.
Ответить