Добавлено: Вс фев 09, 2025 21:46
Столько полезных изменений. Спасибо, будем тестить.Loopback писал(а):Версия Autorun 2.2.16
Столько полезных изменений. Спасибо, будем тестить.Loopback писал(а):Версия Autorun 2.2.16
Проблемы действительно возникли, пришлось разбираться. Пока всё запустилось, но чтобы и другое всё проверить, потребуется больше времени.Loopback писал(а):Ввиду большого объема внутренних изменений могут возникнуть неожиданные проблемы в любой функции, так что при необходимости будут выпущены хотфиксы.
Код: Выделить всё
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
Код: Выделить всё
# внутренние ассоциации
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
Я уже переделал на обновленный TCLANG.Orion9 писал(а):чтобы и другое всё проверить, потребуется больше времени.
Я сначала применил вашу функцию, но потом увидел, что вы еще один процесс запускает. Я так понял у вас эта функция для тестирования. Мне-то пришлось ее полностью переделать. А завтра на новый алгоритм переделаю. И в справке приведен пример с ассоциациями с использованием нового функционала. Но и ваш вариант у меня полностью работал.Orion9 писал(а):# внутренние ассоциации
Есть две очевидные проблемы:Orion9 писал(а):Вроде всё работает, но иногда спотыкается, а иногда и ТС валит.
Код: Выделить всё
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В подразделе "Конфигурация TC" справочных примеров Flasher добавил пример на эту тему, гляньте, может пригодится.Orion9 писал(а):Ну и с новыми функциями сам Гислер велел:
Код: Выделить всё
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
Код: Выделить всё
[Random]
Enable=1
Interval=10000
Debug=1
...
WincmdCopyComplete=Chewbacca
WincmdDeleteComplete=Операция Ы
...
Теперь всё работаетLoopback писал(а):Есть две очевидные проблемы:
Пригодится-то он пригодится, но сам пример не до конца рабочий. Ранее я уже писал, чем обусловлен вызов окна ассоциаций, вот и автор TCASwitcher тоже был вынужден откатится к тому же и всё по той же причине:Loopback писал(а):В подразделе "Конфигурация TC" справочных примеров Flasher добавил пример на эту тему, гляньте, может пригодится.
Нет, функция больше не для тестирования, даже успел имя переменной окружения поменять с %ICON_TEST% на %ICON_ASSOC%AkulaBig писал(а):но потом увидел, что вы еще один процесс запускает. Я так понял у вас эта функция для тестирования.
Не совсем понял, при чем тут TCASwitcher. У меня вроде нет проблем при запуске с отключенными ассоциациями.Orion9 писал(а): по поводу окна написал выше (если вы имеете в виду строку RunThread AssocWinSynс).
Еще-бы понять, про что вы.[/cut]Orion9 писал(а):не вижу хайлайтера от yozhic в AkelPad-е.
Код: Выделить всё
[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
Код: Выделить всё
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Повезло. А у меня не работает, в том плане, что значки на панелях не меняются, если при старте ТС внутренние ассоциации были выключены.AkulaBig писал(а):У меня вроде нет проблем при запуске с отключенными ассоциациями.
Про эту подсветку к файлам Autorun.AkulaBig писал(а):Еще-бы понять, про что вы.
Теперь понял. Да, у меня так-же. TCASwitcher у меня простоял совсем немного времени и я с ним не разбирался. Поэтому не понял вашего намека.Orion9 писал(а):значки на панелях не меняются, если при старте ТС внутренние ассоциации были выключены
Я имею ввиду, что второй поток это слишком. Буду пытаться запихать его в общий поток.Orion9 писал(а):RunThread AssocWinSynс
Теперь понял. Вы просто змей-искусительOrion9 писал(а):Про эту подсветку к файлам 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
Код: Выделить всё
CommandExec cm_ReloadBarIcons
# Обновление внутренних ассоциаций
# Updating internal associations
SendMessage(AUTORUN_TCHANDLE, 1045,0,0)
Код: Выделить всё
# внутренние ассоциации
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
А применение List() не решит проблему? Я пытался сделать через List.Text, но ничего не получилось, так как при командной записи Autorun ругается, что ему нужна переменная нормального формата. А без командной записи никак.Orion9 писал(а):ограничение в 32767 символа у IniRenameSection не такое уж и недостижимое.
А я просто сборку с внешними скриптами забекапил. Потому что второй раз разобраться с кавычками не реальноOrion9 писал(а):Vbs-скрипт оставлен как альтернативный вариант
А вы не подскажите, что это за команда? Пробовал ее заменить на cm_InternalAssociate. Не прокатывает. Но если cm_ReloadBarIcons использовать только один раз, окно ассоциаций появляется.Orion9 писал(а):SendMessage(AUTORUN_TCHANDLE, 1045, 0, 0)
А я ничего не понял ) Ну, может быть Loopback чего подскажет.AkulaBig писал(а):но ничего не получилось
Я так глубоко в систему не лезу. На такие вопросы могут ответить разве что системные разработчики, типа Loopback, либо те, кто давно и плотно сидит в теме автоматизации, типа Flasher. Как я уже говорил, присутствие второго на форуме не помешало бы, но увы - пять лет назад не поделили что-то с админом, а простой народ теперь страдает.AkulaBig писал(а):А вы не подскажите, что это за команда? Пробовал ее заменить на cm_InternalAssociate. Не прокатывает.
Вот мой скрипт переключения секций: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
Первоначально на форуме здесь упоминалась...AkulaBig писал(а):А вы не подскажите, что это за команда?
Оттуда я ее и взял. Поиском нашел. Хотелось-бы узнать, что это за команда.sa писал(а):Первоначально на форуме здесь упоминалась...