| 
 
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| Orion9 
 
  
 Joined: 01 Jan 2024
 Posts: 914
 
 
 | 
			
				|  (Separately) Posted: Mon Jan 13, 2025 17:30    Post subject: |   |  
				| 
 |  
				|  	  | AkulaBig wrote: |  	  | Скорей всего без разницы. | 
 Как бы сказал герой одного известного фильма: "Лёлик, но ведь это не эстетично"
   
 Если запустить монитор процессов, то уже через несколько секунд все окно будет засыпано примерно этим:
 
  	  | Code: |  	  | TOTALCMD.EXE   5220   CreateFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS   
TOTALCMD.EXE   5220   LockFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   QueryStandardInformationFile   D:\Temp\TotalCommanderPortable\wincmd.in
 TOTALCMD.EXE   5220   ReadFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   UnlockFileSingle   D:\Temp\TotalCommanderPortable\wincmd.ini
 TOTALCMD.EXE   5220   CloseFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   CreateFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   LockFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   QueryStandardInformationFile   D:\Temp\TotalCommanderPortable\wincmd.in
 TOTALCMD.EXE   5220   ReadFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   UnlockFileSingle   D:\Temp\TotalCommanderPortable\wincmd.ini
 TOTALCMD.EXE   5220   CloseFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   CreateFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   LockFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   QueryStandardInformationFile   D:\Temp\TotalCommanderPortable\wincmd.in
 TOTALCMD.EXE   5220   ReadFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   UnlockFileSingle   D:\Temp\TotalCommanderPortable\wincmd.ini
 TOTALCMD.EXE   5220   CloseFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   CreateFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   LockFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   QueryStandardInformationFile   D:\Temp\TotalCommanderPortable\wincmd.in
 TOTALCMD.EXE   5220   ReadFile   D:\Temp\TotalCommanderPortable\wincmd.ini   SUCCESS
 TOTALCMD.EXE   5220   UnlockFileSingle   D:\Temp\TotalCommanderPortable\wincmd.ini
 | 
 Но все же я склонен с вами согласиться, что в данном случае это "без разницы". Потому что если открыть Монитор Ресурсов или Process Explorer от Sysinternals, то можно увидеть, что I/O дисковых операций от процесса Totalcmd.exe есть, но самих дисковых операций (чтения/записи) нет. Видимо, всё это просто гоняется в кэше до тех пор, пока файл на диске действительно не изменится.
 
 Все-равно я думаю, Гислеру можно было бы сделать такую переменную, тем более что это несложно.
 
  	  | sa wrote: |  	  | Ещё, если это %COMMANDER_EXE% или имя программы без пути (Totalcmd.exe/TOTALCMD64.EXE). Планируется добавление shell32.dll и, возможно, imageres.dll. | 
 Это безусловно радует, но хотелось бы, чтобы и другие библиотеки значков тоже умел читать
  |  |  
		| Back to top |  |  
		|  |  
		| sa 
 
 
 Joined: 29 Apr 2009
 Posts: 2709
 
 
 | 
			
				|  (Separately) Posted: Mon Jan 13, 2025 17:51    Post subject: |   |  
				| 
 |  
				| Orion9 Там проблема в производительности, если я правильно понял:
 
  	  | Help wrote: |  	  | New functions and fixes in Total Commander 11.50: Menu: Use icon defined in em_command, but only from wcmicons.dll or .ico files or from the main program, for speed reasons (virus scanners)
 | 
 |  |  
		| Back to top |  |  
		|  |  
		| Orion9 
 
  
 Joined: 01 Jan 2024
 Posts: 914
 
 
 | 
			
				|  (Separately) Posted: Mon Jan 13, 2025 19:56    Post subject: |   |  
				| 
 |  
				| sa Ну, если пользователь решит сделать меню, где у него десятки пунктов будут завязаны на значки из exe-файлов, то это его выбор. Только какое отношение это имеет к возможностям Total Commander?
   
 Да и потом, речь больше идет о DLL и ICL, содержащие пользовательские значки, помимо стандартного wcmicons.dll.
 
 P.S. Пересмотрел и адаптировал код, который делал еще в том году, для создания трёх панелей uwdx.
 
 
   Hidden text 	  | Code: |  	  | RegisterCommand 70900 "Uwdx3Bars"
 Func Uwdx3Bars(lParam)
 Local bar = %COMMANDER_PATH% & "\Bars\", usr
 Local b_Ctrl = IsPressed(0x11), b_Shift = IsPressed(0x10), b_Alt = IsPressed(0x12)
 
 #создание панелей
 If b_Alt Then
 CreateUwdxBars()
 Return
 EndIf
 
 If b_Ctrl Then
 usr = "em_auto_uwdxp"
 bar = bar & "Auto_uwdxp.bar"
 ElseIf b_Shift Then
 usr = "em_auto_uwdxa"
 bar = bar & "Auto_uwdxa.bar"
 Else
 usr = "em_auto_uwdxe"
 bar = bar & "Auto_uwdxe.bar"
 EndIf
 
 If FileExist(bar) Then
 CommandExec(usr)
 #ShowPopupMenu /D %bar%
 Else
 ShowHint("Не найден " & bar)
 EndIf
 EndFunc
 
 Func CreateUwdxBars()
 Local f = 0
 ShowDarkHint("Создание панелей", 0)
 f = f + CreateUwdxBar("Auto_uwdxa")
 f = f + CreateUwdxBar("Auto_uwdxe")
 f = f + CreateUwdxBar("Auto_uwdxp")
 ShowDarkHint(f & " из 3 файлов было создано", 0)
 EndFunc
 
 Func CreateUwdxBar(Barname)
 Local i = 0
 Local bar, br2, wdx
 Local uwdx_dir = "\Plugins\uwdx\"
 Local uwdx_exe = "%COMMANDER_PATH%" & uwdx_dir & "uwdx.exe"
 Local uwdx_con = "%%COMMANDER_PATH%%" & uwdx_dir & "uwdx.exe"
 Local uwdx_obj = "%P%N"
 
 bar = %COMMANDER_PATH% & "\Bars\" & barname & ".bar"
 br2 = %COMMANDER_PATH% & "\Bars\" & barname & ".br2"
 
 ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%bar%"""
 ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%br2%"""
 
 If FileExist(bar) Then
 MsgBox("Ошибка удаления " & bar, "uwdx")
 Return 0
 Endif
 
 IniWrite %bar% "Buttonbar" "Buttoncount"  "0"
 If ERROR = 1 Then
 MsgBox("Ошибка создания " & bar, "uwdx")
 Return 0
 EndIf
 
 While i < 100
 IniRead /R wdx %COMMANDER_INI% "ContentPlugins" %"%i%" "stop"
 If wdx="stop" Then Break
 
 wdx = StrTrim(StrRight(wdx, StrLen(wdx)-StrPos(wdx, "\", -1)))
 
 IniWrite %bar% "Buttonbar" %"'Button'   & %i%+1" %uwdx_exe%
 IniWrite %bar% "Buttonbar" %"'Menu'     & %i%+1" %wdx%
 IniWrite /EV- %bar% "Buttonbar" %"'Cmd' & %i%+1" "%COMSPEC% /k"
 
 Switch Barname
 Case "Auto_uwdxa"
 IniWrite %bar% "Buttonbar" %"'Param' & %i%+1"  '"""%uwdx_con%""" /I %wdx% ""%uwdx_obj%""'
 Case "Auto_uwdxe"
 IniWrite %bar% "Buttonbar" %"'Param' & %i%+1"  '"""%uwdx_con%""" /E /I %wdx% ""%uwdx_obj%""'
 Else
 IniWrite %bar% "Buttonbar" %"'Param' & %i%+1"  '"""%uwdx_con%""" /I "%wdx%"'
 EndSwitch
 
 i = i + 1
 Wend
 IniWrite %bar% "Buttonbar" "Buttoncount"  %i%
 Return 1
 EndFunc
 
 Func ShowUwdxe
 CommandExec em_auto_uwdxe
 EndFunc
 
 Func ShowUwdxa
 CommandExec em_auto_uwdxa
 EndFunc
 
 Func ShowUwdxp
 CommandExec em_auto_uwdxp
 EndFunc
 
 
 | 
   Hidden text 	  | Code: |  	  | [em_auto_uwdxe]
cmd=OPENBARMENU %COMMANDER_PATH%\Bars\Auto_uwdxe.bar
 [em_auto_uwdxa]
 cmd=OPENBARMENU %COMMANDER_PATH%\Bars\Auto_uwdxa.bar
 [em_auto_uwdxp]
 cmd=OPENBARMENU %COMMANDER_PATH%\Bars\Auto_uwdxp.bar
 
 | 
   Hidden text 	  | Code: |  	  | TOTALCMD#BAR#DATA
70900
 
 %COMSPEC%
 Панели Uwdx|Alt - Создать панели|Ctrl - Структура полей|Shift - Все поля плагина
 
 
 -1
 
 | 
Пользовательски команды можно привязать к хоткеям или кликам мышки, например:
 
  	  | Code: |  	  | ControlSetMouseAction /R /K:C 3 ShowUwdxe
ControlSetMouseAction /R /K:C /K:S 3 ShowUwdxa
 
 | 
 |  |  
		| Back to top |  |  
		|  |  
		| AkulaBig 
 
 
 Joined: 03 Dec 2008
 Posts: 454
 
 
 | 
			
				|  (Separately) Posted: Mon Jan 13, 2025 21:39    Post subject: |   |  
				| 
 |  
				|  	  | Orion9 wrote: |  	  | Если запустить монитор процессов, то уже через несколько секунд все окно будет засыпано примерно этим:
 
 | 
 Запустите какой-нибудь шпион и увидите, что там творится с любым окном.
 |  |  
		| Back to top |  |  
		|  |  
		| Orion9 
 
  
 Joined: 01 Jan 2024
 Posts: 914
 
 
 | 
			
				|  (Separately) Posted: Mon Jan 13, 2025 23:56    Post subject: |   |  
				| 
 |  
				| AkulaBig Да это понятно. Просто речь шла о файловых операциях как раз, а не об окнах. Loopback же подтвердил, что макрос AUTORUN_TCLANG просто считывает ключ из wincmd.ini, что равноценно обычному вызову функции IniRead. Как по мне, то между:
 
 И: 	  | Code: |  	  | IniRead /R lng %COMMANDER_INI% "Configuration" "LanguageIni"
If lng = "WCMD_RUS.LNG" Then
 
 Endif
 
 
 | 
 
 Я бы однозачно выбрал второе 	  | Code: |  	  | If %COMMANDER_LANG% = "WCMD_RUS.LNG" Then
 Endif
 
 | 
   
 P.S. И все-таки добрались у меня руки до функции SuperWDX. В прошлый раз ее доделать помешал плагин wdx4i, который не хотел загружаться в объект, но поскольку Loopback исправил ошибку, я решил придать всему этому какой-то законченный вид:
 
 
   Hidden text 	  | Code: |  	  | Func GetSuperWdx(FileName, FieldIndex, UnitIndex)
 Static video_ext = ".mp4 .mkv .avi", _
 audio_ext = ".mp3 .flac .m4a", _
 picture_ext = ".jpg .bmp .gif .png", _
 archive_ext = ".7z .rar .zip .cab .zst"
 
 If StrPos(FileGetAttr(FileName), "D") Then
 Return "<Dir>"
 Endif
 
 Local file_ext
 Local ext_pos = StrPos(FileName, '.', -1)
 
 if ext_pos > 0 Then
 
 file_ext = StrMid(FileName, ext_pos+1, StrLen(FileName)-ext_pos)
 
 If StrPos(video_ext, '.' & file_ext) Then Return GetVideoInfo(FileName)
 
 If StrPos(audio_ext, '.' & file_ext) Then Return GetAudioInfo(FileName)
 
 If StrPos(picture_ext, '.' & file_ext) Then Return GetPicsInfo(FileName)
 
 If StrPos(archive_ext, '.' & file_ext) Then Return GetArchInfo(FileName)
 
 Endif
 
 EndFunc
 
 Func GetVideoInfo(FileName)
 Local s
 obj = Plugin("TCMediaInfo")
 If ERROR = 0 Then
 obj.FileName = FileName
 # All video as string
 s = obj.GetValue(28)
 Free(obj)
 Else
 s = "Plugin error " & ERROR
 Endif
 Return s
 EndFunc
 
 Func GetAudioInfo(FileName)
 Local s
 obj = Plugin("TCMediaInfo")
 If ERROR = 0 Then
 obj.FileName = FileName
 # All audio as string
 s = obj.GetValue(39)
 Free(obj)
 Else
 s = "Plugin error " & ERROR
 Endif
 Return s
 EndFunc
 
 Func GetPicsInfo(FileName)
 Local s
 obj = Plugin("wdx4i")
 If ERROR = 0 then
 obj.FileName = FileName
 # wdx4i.pixw, wdx4i.pixh, wdx4i.orient, wdx4i.depth
 s = obj.GetValue(5)  & " x " & obj.GetValue(6) & " , " & obj.GetValue(7) & " , " & obj.GetValue(13)
 Free(obj)
 Else
 s = "Plugin error " & ERROR
 Endif
 Return s
 EndFunc
 
 Func GetArchInfo(FileName)
 Local s
 obj = Plugin("Total7zip")
 If ERROR = 0 then
 obj.FileName = FileName
 s = (obj.GetValue(5) <> "" ? obj.GetValue(5) & ", " : "")
 s &= "Folders: " & obj.GetValue(6) & ", Files: " & obj.GetValue(7)
 s &= (obj.GetValue(11) = "+" ? ", Solid" : "")
 s &= (obj.GetValue(1) = "+" ? ", Encripted" : "")
 s &= (obj.GetValue(9) <> "" ? ", Method: " & obj.GetValue(9) : "")
 s &= ",Type: " & obj.GetValue(8)
 Free(obj)
 Else
 s = "Plugin error " & ERROR
 Endif
 Return s
 EndFunc
 
 | 
 Вывод в дополнительном поле выглядит примерно так:
 
 
   Hidden text 	  | Code: |  	  | test 01.m4a   AAC, 44.1 kHz, 2 Ch, 491 Kbps
test 02.flac   FLAC, 44.1 kHz, 2 Ch, 16 Bits, 848 Kbps
 test 03.flac   FLAC, 44.1 kHz, 2 Ch, 16 Bits, 768 Kbps
 test 05.mp3   MPEG Audio, 44.1 kHz, 2 Ch, 320 Kbps
 test 06.mp3   MPEG Audio, 44.1 kHz, 2 Ch, 320 Kbps
 test 08.jpg   3840 x 2160 , Landscape , 24
 test 09.7z   93%, Folders: 0, Files: 1, Method: LZMA2:18,Type: 7z
 test 10.jpg   505 x 550 , Portrait , 24
 test 11.jpg   100 x 100 , Quadrate , 24
 test 12.JPG   1223 x 465 , Portrait , 24
 test 13.JPG   465 x 1223 , Landscape , 24
 test 14.7z   27%, Folders: 1, Files: 5, Method: LZMA2:6k,Type: 7z
 test 15.7z   26%, Folders: 2, Files: 73, Solid, Method: LZMA2:26 LZMA:20 BCJ2,Type: 7z
 test 16.zst   Folders: 0, Files: 1, Method: header-open-only: XXH64 single-segments wnd-MAX:29893,Type: zstd
 test 17.zst   Folders: 0, Files: 1, Method: header-open-only: XXH64 single-segments wnd-MAX:29663,Type: zstd
 test 18.mkv   1920x804 (2.39:1), 23.976 fps, HEVC, 6,96 MBps
 test 18.mp4   1920x1080 (16:9), 23.976 fps, AVC, 3,96 MBps
 test 19.mp4   1920x1080 (16:9), 30.000 fps, AVC, 2,65 MBps
 test 19.png   676 x 757 , Portrait , 24
 test 20.png   960 x 687 , Landscape , 24
 test 21.png   1223 x 465 , Landscape , 24
 test 22.zip   48%, Folders: 1, Files: 6,Type: zip
 test 23.zip   61%, Folders: 1, Files: 18,Type: zip
 test 24.zip   66%, Folders: 1, Files: 21,Type: zip
 test 25.zip   41%, Folders: 3, Files: 106,Type: zip
 test 26.zip   41%, Folders: 3, Files: 106,Type: zip
 test 27.rar   23%, Folders: 1, Files: 15, Solid, Method: v6:16M:m5,Type: Rar5
 
 | 
 Ну не знаю... Вам решать. В любом случае, в Autorun сейчас есть такая возможность. Можно, конечно, при желании, все более тонко подстроить под конкретную задачу, это был лишь пример. Но главный конфиг обязательно должен в первой строке объявлять дополнительное поле:
 
  	  | Code: |  	  | Pragma AutorunPluginFields "SuperWdx:::GetSuperWdx"  | 
 |  |  
		| Back to top |  |  
		|  |  
		| AkulaBig 
 
 
 Joined: 03 Dec 2008
 Posts: 454
 
 
 | 
			
				|  (Separately) Posted: Tue Jan 14, 2025 00:28    Post subject: |   |  
				| 
 |  
				|  	  | Orion9 wrote: |  	  | Я бы однозачно выбрал второе   
 | 
 Дак понятно, что эта переменная для удобства создана.
 
  	  | Orion9 wrote: |  	  | В любом случае, в Autorun сейчас есть такая возможность. | 
 Я только что перевод DirMenu закончил. Следующий этап колонки пользователя. Может пригодиться.
 |  |  
		| Back to top |  |  
		|  |  
		| Orion9 
 
  
 Joined: 01 Jan 2024
 Posts: 914
 
 
 | 
			
				|  (Separately) Posted: Wed Jan 15, 2025 00:20    Post subject: |   |  
				| 
 |  
				|  	  | AkulaBig wrote: |  	  | Я только что перевод DirMenu закончил. Следующий этап колонки пользователя. Может пригодиться. | 
 В смысле? Если Гислер сделает такую переменную? Конечно пригодится!
 
 А еще бы очень пригодилось, если бы он сделал раскрытие переменных окружения в сплывающих подсказках. Тогда не пришлось бы прыгать с бубном и определять индекс нужной кнопки для дальнейших манипуляций. Хотя всех проблем бы это не решило, но помогло бы во многом.
 
 А пока приходится выходить из положения вот такими функциями
   
 
   Hidden text 	  | Code: |  	  | # поиск индекса кнопки на панели
# примеры вызова:
 #{
 BarsPath = %COMMANDER_PATH% & "\Bars\"
 
 idx = FindButtonIdx(BarsPath & "Main.bar", "cmd", "61007")
 idx = FindButtonIdx(BarsPath & "Main.bar", "menu", "Auto_bars")
 idx = FindButtonIdx(BarsPath & "Main.bar", "button", "WCMICONS.dll,72")
 
 MsgBox(FindButtonIdx(BarsPath & "Main.bar", "param", '/ef "tcm(60011,1)"'))
 #}
 
 Func FindButtonIdx(ButtonBar, ButtonKey, ButtonVal)
 Local txt, pos, len, sub, idx = 0
 If Not FileExist(ButtonBar) Then
 ShowDarkHint("Панель не найдена " & ButtonBar, 0)
 Return 0
 EndIf
 len = StrLen(ButtonKey)
 ProcessExecGetOutput txt %COMSPEC% '/c type "%ButtonBar%"'
 pos = StrPos(txt, "=" & ButtonVal)
 If pos = 0 Then Return 0
 For i = 0 To 3
 sub = StrMid(txt, pos-len-i, len)
 #OutputDebugString("Autorun: " & sub)
 If sub = ButtonKey Then
 idx = StrMid(txt, pos-i, i)
 #OutputDebugString("Autorun: idx = " & idx)
 If IsInt(idx) Then Break
 Endif
 Next
 # перепроверка индекса
 If idx > 0 Then
 IniRead txt %ButtonBar% "Buttonbar" %"%ButtonKey% & %idx%"
 #OutputDebugString("Autorun: Key = " & txt)
 If StrPos(txt, ButtonVal) > 0 Then Return idx
 #OutputDebugString("Autorun: Idx = " & idx)
 EndIf
 Return 0
 EndFunc
 | 
 |  |  
		| Back to top |  |  
		|  |  
		| Orion9 
 
  
 Joined: 01 Jan 2024
 Posts: 914
 
 
 | 
			
				|  (Separately) Posted: Wed Jan 15, 2025 19:21    Post subject: |   |  
				| 
 |  
				| AkulaBig Кажется, я понял, в чём была сложность той задачи: склеенные панели имеют один серьёзный недостаток - изменения, сделанные на склеенных панелях, не применяются к панелям-источникам и не синхронизируются с ними, а значит, и смысла в такой склейке практически никакого.
 
 Но всё-равно я пересмотрел и доработал код. Теперь панели можно выбирать из меню, открывать на главной панеле, объединять с главной панелью и закреплять для последующих быстрых вызовов.
 
 В меню действуют модификаторы: Ctrl - выбрать и объединить, Shift - закрепить, Ctrl+Shift - перейти к файлу. Вызов без модификаторов загружает выбранную панель на главную панель инструментов.
 
 У самой кнопки тоже есть модификаторы: Ctrl - объединить панель и открыть, Shift - открыть закрепленную панель, Ctrl+Shift - выбор типа меню, Alt - открыть объединенную панель, Win - пересоздать меню из *.bar файлов.
 
 Под "закреплением" подразумевается выбор панели в качестве текущей для дальнейших операций. Информация о выбранной панеле записывается в секцию [Autorun] файла wincmd.ini, ключ AutoBars (например: AutoBars=Vertical.bar). Если ключа нет, то "Vertical.bar" считается умолчанием. Панели ищутся в папке, указанной в переменной BarsPath (у меня, наверное, как и у большинства, это %COMMANDER_PATH% & "\Bars\").
 
 Выбор типа меню происходит между тремя вариантами: "ShowPopupMenu", "em_bars_panel", "DisplayOpenBar". Меню сохраняется в файле "Auto_bars.bar": ShowPopupMenu открывает этот файл встроенной функцией, "em_bars_panel" вызывает пользовательскую команду, "DisplayOpenBar" то же, что и "em_bars_panel", только с позиционированем (на основе примера от Loopback). Команда в usercmd.ini:
 
  	  | Code: |  	  | [em_bars_panel]
cmd=OPENBARMENU
 param=%|COMMANDER_PATH|\Bars\Auto_bars.bar
 | 
 Еще одна команда, которую нужно добавить в usercmd.ini:
 
  	  | Code: |  	  | [em_open_bar]
cmd=OPENBAR
 param=%|COMMANDER_PATH|\Bars\%A0
 | 
 Используется для загрузки панели на главную панель инструментов. Поскольку загруженная панель может не содержать кнопки возврата, не лишним будет сделать пользовательскую команду, которая будет загружать главную панель инструментов, и посадить ее на хоткей. Например, у меня это:
 
  	  | Code: |  	  | [em_open_main_bar]
cmd=OPENBAR
 param=%|COMMANDER_PATH|\Bars\Main.bar
 | 
 
 В общем, пока все это только в режиме тестирования, но некоторые удобства уже есть. Да и сам код пригодится для повторного использования в качестве наработок. Путь к Clip.vbs нужно указать в скрипте.
 
 
   Clip.vbs 	  | Code: |  	  | If WScript.Arguments.Count = 0 Then
FileName = "Clip.txt"
 Else
 FileName = WScript.Arguments(0)
 End If
 
 Set objHTML = CreateObject("htmlfile")
 ClipboardText = objHTML.ParentWindow.ClipboardData.GetData("text")
 
 Set objFSO = CreateObject("Scripting.FileSystemObject")
 Set objFile = objFSO.OpenTextFile(FileName, 2, true)
 objFile.WriteLine ClipboardText
 objFile.Close
 | 
   Functions.aucfg 	  | Code: |  	  | # модуль дополнительных функций
 Func SaveClipToFile(Filename)
 Local vbsp = %COMMANDER_PATH% & "\Scripts\Vbs\"
 Local vbsf = vbsp & "Clip.vbs"
 If Not FileExist(vbsf) Then
 ShowDarkHint("Скрипт не найден " & vbsf, 0)
 Return 0
 EndIf
 ShellExec /SW_HIDE /WAIT:2000 %vbsf% '"%Filename%"' %vbsp%
 Return 1
 EndFunc
 
 Func ShowDarkHint(DarkHint, HintSleep = 1000)
 
 SetHintParam("ShowHint", "Font", 10, "Arial")
 SetHintParam("ShowHint", "BackColor", 0x001C1C1C)
 SetHintParam("ShowHint", "Text", 0xFFFFFF)
 
 ShowHint(DarkHint)
 
 If HintSleep > 0 Then
 Sleep(HintSleep)
 WinSetState(23)
 Else
 Sleep(100)
 Endif
 SetHintParam("ShowHint", "Reload")
 
 EndFunc
 
 Func CreateNewBar(BarPath, BarName, BackButton = true)
 
 Local bar, br2, def
 
 bar = BarPath & BarName & ".bar"
 br2 = BarPath & BarName & ".br2"
 
 ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%bar%"""
 ShellExec /SW_HIDE /WAIT:2000 %COMSPEC% "/c del /f /q ""%br2%"""
 
 If FileExist(bar) Then
 ShowDarkHint("Ошибка удаления " & bar, 0)
 Return false
 Endif
 
 IniWrite %bar% "Buttonbar" "Buttoncount"  "0"
 If ERROR = 1 Then
 ShowDarkHint("Ошибка создания " & bar, 0)
 Return false
 EndIf
 
 IniRead def %COMMANDER_INI% "Buttonbar" "Buttonbar" "%COMMANDER_PATH%\DEFAULT.BAR"
 
 If BackButton Then
 IniWrite %bar% "Buttonbar" "Button1" "wcmicons.dll,15"
 IniWrite %bar% "Buttonbar" "Cmd1" %def%
 IniWrite %bar% "Buttonbar" "Menu1" "Вернуться"
 Endif
 
 Return true
 EndFunc
 
 Func DisplayOpenBar(UsercmdName)
 Local i, h
 MouseGetPos("x", "y")
 CommandExec(UsercmdName)
 Sleep(20)
 # ожидание панели
 For i = 1 To 150
 h = WinFind(0, "#32768")
 If h > 0 Then Break
 Sleep(10)
 Next
 If h = 0 Then
 ShowHint("Панель не найдена")
 Return
 Endif
 WinSetPos(x, y,"","","", h)
 EndFunc
 
 # поиск индекса кнопки на панели
 # примеры вызова:
 #{
 BarsPath = %COMMANDER_PATH% & "\Bars\"
 
 idx = FindButtonIdx(BarsPath & "Main.bar", "cmd", "61007")
 idx = FindButtonIdx(BarsPath & "Main.bar", "menu", "Auto_bars")
 idx = FindButtonIdx(BarsPath & "Main.bar", "button", "WCMICONS.dll,72")
 
 MsgBox(FindButtonIdx(BarsPath & "Main.bar", "param", '/ef "tcm(60011,1)"'))
 #}
 
 Func FindButtonIdx(ButtonBar, ButtonKey, ButtonVal)
 Local txt, pos, len, sub, idx = 0
 If Not FileExist(ButtonBar) Then
 ShowDarkHint("Панель не найдена " & ButtonBar, 0)
 Return 0
 EndIf
 len = StrLen(ButtonKey)
 ProcessExecGetOutput txt %COMSPEC% '/c type "%ButtonBar%"'
 pos = StrPos(txt, "=" & ButtonVal)
 If pos = 0 Then Return 0
 For i = 0 To 3
 sub = StrMid(txt, pos-len-i, len)
 #OutputDebugString("Autorun: " & sub)
 If sub = ButtonKey Then
 idx = StrMid(txt, pos-i, i)
 #OutputDebugString("Autorun: idx = " & idx)
 If IsInt(idx) Then Break
 Endif
 Next
 # перепроверка индекса
 If idx > 0 Then
 IniRead txt %ButtonBar% "Buttonbar" %"%ButtonKey% & %idx%"
 #OutputDebugString("Autorun: Key = " & txt)
 If StrPos(txt, ButtonVal) > 0 Then Return idx
 #OutputDebugString("Autorun: Idx = " & idx)
 EndIf
 Return 0
 EndFunc
 | 
   Buttons.aucfg 	  | Code: |  	  | Pragma IncludeOnce
 Global BarsPath = %COMMANDER_PATH% & "\Bars\"
 
 RegisterCommand 61007 "TwoBars"
 RegisterCommand 61008 "SpliceBarItem"
 
 Func SpliceBarItem(lParam)
 Local b_Ctrl = IsPressed(0x11), b_Shift = IsPressed(0x10)
 Local bar = BarsPath & "Auto_bars.bar", def, b, c = 0, mnu, idx, txt, pos, str
 IniRead b %bar% "Buttonbar" %"'Menu' & lParam"
 bar = BarsPath & b
 If Not FileExist(bar) Then
 ShowHint("Панель не найдена " & bar)
 Return
 EndIf
 If Not b_Ctrl And Not b_Shift Then
 CommandExec("em_open_bar", b)
 Return
 Endif
 If b_Ctrl And b_Shift Then
 CommandExec /CD:S %bar%
 Return
 Endif
 IniWrite /R %COMMANDER_INI% "Autorun" "AutoBars" %b%
 IniRead c %bar% "Buttonbar" "Buttoncount"
 # обновление подсказки на главной панели
 IniRead def %COMMANDER_INI% "Buttonbar" "Buttonbar" "%COMMANDER_PATH%\DEFAULT.BAR"
 If StrPos(def, "%COMMANDER_PATH%") Then
 def = %COMMANDER_PATH% & StrReplace(def, "%COMMANDER_PATH%")
 Endif
 idx = FindButtonIdx(def, "cmd", "61007")
 If idx > 0 Then
 mnu = "menu" & idx
 IniRead txt %def% "Buttonbar"  %"%mnu%"
 #OutputDebugString("Autorun: txt = " & txt)
 pos = StrPos(txt, "Объединить панели")
 If pos > 0 Then
 str = StrMid(txt, pos)
 IniWrite %def% "Buttonbar" %"%mnu%" %"%b% & '|' & %str%"
 EndIf
 EndIf
 ShowDarkHint(b & auCRLF & "Панель закреплена." & auCRLF & "Кнопок = " & c, 0)
 If b_Ctrl Then
 TwoBars(1)
 Return
 Endif
 EndFunc
 
 Func Bars2PickMenu(AutoBars)
 Local menu_type = 2
 If Not FileExist(AutoBars) Then
 ShowHint("Не найден " & AutoBars)
 Return
 Endif
 IniRead /R menu_type %COMMANDER_INI% "Autorun" "AutoBarsMenu" %"%menu_type%"
 Switch menu_type
 Case 1
 ShowPopupMenu /D %AutoBars%
 Case 2
 CommandExec("em_bars_panel")
 Else
 #DisplayOpenBar("em_bars_panel")
 RunThread("DisplayOpenBar", "em_bars_panel")
 EndSwitch
 EndFunc
 
 Func TwoBars(lParam)
 
 Local b_Ctrl = IsPressed(0x11), b_Shift = IsPressed(0x10), b_Alt = IsPressed(0x12), b_Win = IsPressed(0x5B)
 
 Local bar = "Vertical.bar", usr, usr1 = "Auto_user.bar", bar1, def, brs, op = 0
 Static m = 0, _
 aMenuType = List("ShowPopupMenu","em_bars_panel","DisplayOpenBar")
 
 usr = BarsPath & usr1
 brs = BarsPath & "Auto_bars.bar"
 
 If b_Ctrl And b_Shift Then
 m += 1
 m = (m > 3 ? 1 : m)
 IniWrite /R %COMMANDER_INI% "Autorun" "AutoBarsMenu" %m%
 ShowHint("Тип меню: " & m & " : "& aMenuType[m-1])
 Return
 EndIf
 
 If lParam = 1 Then b_Ctrl = true
 
 If Not (b_Ctrl Or b_Shift Or b_Alt Or b_Win) Then
 If FileExist(brs) Then
 Bars2PickMenu(brs)
 Return
 Else
 b_Win = true
 EndIf
 EndIf
 
 If b_Win Then
 Local aBars = List(), txt, pipe, j
 ProcessExecGetOutput pipe %COMSPEC% "/c dir /b *.bar" %BarsPath%
 aBars.Text = pipe
 txt = "[Buttonbar]"
 txt &= auCRLF & "Buttoncount=" & aBars.Count
 
 For j = 0 To aBars.Count - 1
 txt &= auCRLF &    "Cmd" & j+1 & "=cm_SpliceBarItem " & j+1
 #txt &= auCRLF &  "Param" & j+1 & "=" & j+1
 txt &= auCRLF &   "Menu" & j+1 & "=" & aBars[j]
 txt &= auCRLF & "Button" & j+1 & "=wcmicons.dll,14"
 Next
 
 Free(aBars)
 ClipPut(txt)
 If SaveClipToFile(brs) Then Bars2PickMenu(brs)
 Return
 EndIf
 
 If b_Alt Then
 If Not FileExist(usr) Then
 ShowHint("Панель не найдена " & usr)
 Else
 CommandExec("em_open_bar", usr1)
 EndIf
 Return
 EndIf
 
 IniRead /R bar1 %COMMANDER_INI% "Autorun" "AutoBars" %"%bar%"
 bar = BarsPath & bar1
 
 If Not FileExist(bar) Then
 ShowHint("Панель не найдена " & bar)
 Return
 EndIf
 
 If b_Shift Then
 CommandExec("em_open_bar", bar1)
 Return
 EndIf
 
 ShowDarkHint("Объединение c " & bar1, 0)
 
 Local aBar = List(), _
 aItems = List("cmd","param","button","menu","path","iconic"), _
 offset, out, b, i, j, k, old, new, found
 
 IniRead def %COMMANDER_INI% "Buttonbar" "Buttonbar" "%COMMANDER_PATH%\DEFAULT.BAR"
 If StrPos(def, "%COMMANDER_PATH%") Then
 def = %COMMANDER_PATH% & StrReplace(def, "%COMMANDER_PATH%")
 Endif
 If Not FileExist(def) Then
 ShowDarkHint("Главная панель не найдена " & def, 0)
 Return
 EndIf
 IniRead offset %def% "Buttonbar" "Buttoncount" 0
 
 ProcessExecGetOutput def %COMSPEC% '/c type "%def%"'
 
 ProcessExecGetOutput out %COMSPEC% '/c type "%bar%"'
 IniRead b %bar% "Buttonbar" "Buttoncount" 0
 
 aBar.Text = out
 For j = 0 To aBar.Count - 1
 found = false
 For i = 1 To b
 For k = 0 To aItems.Count - 1
 old = aItems[k] & i & "="
 new = aItems[k] & i + offset + 1 & "="
 If StrPos(aBar[j], old) Then
 aBar[j] = StrReplace(aBar[j], old, new)
 found = true
 break
 EndIf
 Next
 if found then break
 Next
 Next
 #aBar.Remove(0, 2)
 aBar[0] = "button" & offset + 1 & "="
 aBar[1] = "iconic" & offset + 1 & "="
 out = def & auCRLF & aBar.Text
 Free(aBar)
 Free(aItems)
 
 ClipPut(out)
 op = SaveClipToFile(usr)
 IniWrite %usr% "Buttonbar" "Buttoncount"  %"%offset%+1+%b%"
 
 If op = 1 Then ShowDarkHint("Панели объединены", 0)
 
 If IsPressed(0x12) Then Return
 If IsPressed(0x10) Then
 CommandExec /CD:S %usr%
 Return
 EndIf
 CommandExec("em_open_bar", usr1)
 EndFunc
 
 | 
   Кнопка 	  | Code: |  	  | TOTALCMD#BAR#DATA
61007
 
 totalcmd.exe
 Объединить панели| |Ctrl - объединить и открыть|Shift - открыть закрепленную|Ctrl+Shift - выбор типа меню| |Alt - открыть объединенную|Win - пересоздать меню *.bar
 
 
 -1
 | 
   TOTALCMD.INC 	  | Code: |  	  | [________Autorun_________]=0
cm_SpliceBarItem=61008;Splice Bar Menu
 
 | 
 |  |  
		| Back to top |  |  
		|  |  
		| AkulaBig 
 
 
 Joined: 03 Dec 2008
 Posts: 454
 
 
 | 
			
				|  (Separately) Posted: Wed Jan 15, 2025 20:20    Post subject: |   |  
				| 
 |  
				|  	  | Orion9 wrote: |  	  | AkulaBig склеенные панели имеют один серьёзный недостаток - изменения, сделанные на склеенных панелях, не применяются к панелям-источникам и не синхронизируются с ними, а значит, и смысла в такой склейке практически никакого.
 
 | 
 Вот именно такая панель мне и нужна. И в этом ее смысл. Таким образом я не передаю свой мусор в сборку.
 |  |  
		| Back to top |  |  
		|  |  
		| Orion9 
 
  
 Joined: 01 Jan 2024
 Posts: 914
 
 
 | 
			
				|  (Separately) Posted: Thu Jan 16, 2025 00:08    Post subject: |   |  
				| 
 |  
				| AkulaBig, я понял. 
 Просто я почувствовал то же самое, что, вероятно, чувствовали и вы: не смог до конца понять, что мне нужно, и внятно сформулировать задачу
  Причину этого описал выше - склеенная панель несет больше проблем, чем пользы. Малейший рассинхрон - и можно окончательно запутаться в трех соснах трех панелях: главной, вспомогательной и объединенной. Что самое плохое - склеенную панель уже не так просто разобрать на части, как ее собрать. 
 Но может быть для вашей задачи это и не нужно? Может быть, вам просто достаточно сделать две одинаковые главные панели и переключаться между ними по кругу: одна - официальная, другая - черновая. На вторую вы и будете докидывать кнопки, которые используются только для вашей работы, а первая будет оставаться в нетронутом виде. И алгоритм от этого будет гораздо проще, а значит и круче ))
 
 Переключение по кругу между тремя панелями:
 
  	  | Code: |  	  | # Alt+F1
SetHotkeyAction /K:A /H:F1 MainBarCycle
 
 Func MainBarCycle()
 Static j = -1, aBarName = List("Main","Help", "Vertical")
 j += 1
 j = (j > aBarName.Count - 1 ? 0 : j)
 bar = "%COMMANDER_PATH%\Bars\" & aBarName[j] & ".bar"
 IniWrite /R %COMMANDER_INI% "Buttonbar" "Buttonbar" %bar%
 SendMessage(AUTORUN_TCHANDLE, 11, 0, 0)
 SendCommand 2901
 SendCommand 2901
 sleep(50)
 SendMessage(AUTORUN_TCHANDLE, 11, 1, 0)
 WinRedraw(1)
 ShowHint("Включена: " & aBarName[j] & ".bar")
 Sleep(800)
 WinSetState(23)
 EndFunc
 
 | 
 Если не нужно запоминать панель в wincmd.ini и посылать cm_VisButtonBar для обновления изменений в окне ТС, то можно просто загружать ее командой OPENBAR, как это сделано постом выше, т.е CommandExec("em_open_bar", aBarName[j] & ".bar")
 
  	  | Code: |  	  | [em_open_bar]
cmd=OPENBAR
 param=%|COMMANDER_PATH|\Bars\%A0
 | 
 Но тогда при выходе, главная панель будет оставаться одной и той же.
 |  |  
		| Back to top |  |  
		|  |  
		| AkulaBig 
 
 
 Joined: 03 Dec 2008
 Posts: 454
 
 
 | 
			
				|  (Separately) Posted: Thu Jan 16, 2025 06:26    Post subject: |   |  
				| 
 |  
				|  	  | Orion9 wrote: |  	  | Просто я почувствовал то же самое, что, вероятно, чувствовали и вы: не смог до конца понять, что мне нужно
 | 
 Не поняли меня на форуме TCIMG. Поэтому пришлось самому команду доделывать. А я-то прекрасно знал, что мне нужно.
 
  	  | Orion9 wrote: |  	  | склеенная панель несет больше проблем, чем пользы. | 
 Несколько лет уже пользуюсь и очень доволен.
 
  	  | Orion9 wrote: |  	  | можно окончательно запутаться в трех соснах трех панелях: главной, вспомогательной и объединенной. | 
 У меня всего две панели. Главная и пользователя. Если не лень, посмотрите видео про эту панель в папке моей сборки. Там все подробно показано.
 
  	  | Orion9 wrote: |  	  | Может быть, вам просто достаточно сделать две одинаковые главные панели 
 | 
 И все это будет храниться в папке ТС и передаваться вместе со сборкой. Вы предлагаете стандартный вариант, по которому все делают дополнительные панели и который меня совершенно не устраивает.
 
   Вот посмотрите. Я работаю в ТС. Когда мне надо воспользоваться какой-то программкой, я щелкаю по файлу и запускаю ПП. После перезагрузки ПП исчезла. Никакого мусора я через сборку не передаю.
 Главный смысл моей панели, что она должна храниться в отдельном месте.
 
  	  | Orion9 wrote: |  	  | можно просто загружать ее командой OPENBAR
 | 
 Именно так у меня и происходит.
 
  	  | Orion9 wrote: |  	  | Но тогда при выходе, главная панель будет оставаться одной и той же.
 | 
 Именно это мне и нужно.
 Собственно меня моя панель полностью устраивает. Отказываться от TCIMG я не собираюсь. У меня очень много на ней завязано.
 |  |  
		| Back to top |  |  
		|  |  
		| Orion9 
 
  
 Joined: 01 Jan 2024
 Posts: 914
 
 
 | 
			
				|  (Separately) Posted: Thu Jan 16, 2025 11:22    Post subject: |   |  
				| 
 |  
				|  	  | AkulaBig wrote: |  	  | И все это будет храниться в папке ТС и передаваться вместе со сборкой. | 
 С чего вы решили? Просто поменяйте относительный путь на абсолютный, и все.
 
 Мой последний пример остается в силе. Уберите третий элемент массива, замените относительный путь и добавьте em_команду. Можете сделать проверку существования вашего личного файла: если он не существует, ничего не переключать.
 
 А пользователю вся эта склейка панелей (да еще и с выбором в каталоге) вряд ли нужна, уж поверьте.
 |  |  
		| Back to top |  |  
		|  |  
		| AkulaBig 
 
 
 Joined: 03 Dec 2008
 Posts: 454
 
 
 | 
			
				|  (Separately) Posted: Thu Jan 16, 2025 12:31    Post subject: |   |  
				| 
 |  
				|  	  | Orion9 wrote: |  	  | А пользователю вся эта склейка панелей (да еще и с выбором в каталоге) вряд ли нужна, уж поверьте.
 | 
 Я вообще-то тоже пользователь и мне нужна именно такая панель и никакая другая. Мне не нужны две панели, между которыми я буду переключаться.
 |  |  
		| Back to top |  |  
		|  |  
		| Orion9 
 
  
 Joined: 01 Jan 2024
 Posts: 914
 
 
 | 
			
				|  (Separately) Posted: Thu Jan 16, 2025 14:01    Post subject: |   |  
				| 
 |  
				|  	  | AkulaBig wrote: |  	  | Мне не нужны две панели, между которыми я буду переключаться. | 
 А сейчас вы что делаете, не переключаетесь, что ли?
   
 
   P.S.Мой пример все еще в силе. Пока я не понял, в чем заключается удобство вашего способа. Если вам действительно удобно как пользователю запускать каждый раз файл под курсором, чтобы загрузить его на панель, то дело-то ваше. А я, пожалуй, останусь при своем хоткее, и буду переключать панели по короткому кругу. |  |  
		| Back to top |  |  
		|  |  
		| AkulaBig 
 
 
 Joined: 03 Dec 2008
 Posts: 454
 
 
 | 
			
				|  (Separately) Posted: Thu Jan 16, 2025 14:19    Post subject: |   |  
				| 
 |  
				|  	  | Orion9 wrote: |  	  | А сейчас вы что делаете, не переключаетесь, что ли?
   
 | 
 Не переключаюсь. просто к основной панели добавляю ПП. При этом основная панель доступна.
 |  |  
		| Back to top |  |  
		|  |  
		|  |  
  
	| 
 
 | You cannot post new topics in this forum You cannot reply to topics in this forum
 You cannot edit your posts in this forum
 You cannot delete your posts in this forum
 You cannot vote in polls in this forum
 
 |  
 Powered by phpBB © 2001, 2005 phpBB Group
 
 |