Autorun

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

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

Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig
Как это?

В вашей сборке: "Запуск" -> Изменить меню "Запуск" -> Добавить -> (Любая команда для нового пункта) -> OK -> OK.

Сменая языка на Английский и назад на Русский.

И всё. Добавленного пункта нету :)

И кстати, я, кажется, понял, что вы имели в виду, когда говорили о PostMessage. Там у вас есть закомментированнные строки на этот счет, но в Autorun такой вызов излишен, поскольку объявленные функции можно вызывать изнутри сразу по имени. PostMessage - это только для внешнего вызова по зарегистрированному коду.
Loopback писал(а):Числу можно сопоставить имя в файле TOTALCMD.INC... нужно, чтобы имя команды начиналось с cm_.
Очень важное уточнение, которое нужно добавить в справку. Без префикса cm_* не работает, хотя мне очень понравилась идея. Сделал для пробы в TOTALCMD.INC секцию:

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

[________Autorun_________]=0
cm_SpliceBarItem=60015;Splice Bar Menu
А в WCMD_RUS.INC:

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

Autorun="Плагин «Autorun»"
60015="Пункт меню «Объединить панели»"
Все отображается в стандартном окне выбора команды. Прикольно.)
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Наконец-то получилось написать скрипт на vbs:

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

Dim objArgs
Dim objShell
Dim arrLang
	
arrLang = Array("[User_rus]", "[User_eng]")

Set objShell = WScript.CreateObject("WScript.Shell")

INI = objShell.ExpandEnvironmentStrings("%COMMANDER_PATH%\Ini\User.ini")
Text = CreateObject("Scripting.FileSystemObject").OpenTextFile(INI, 1).ReadAll

for i = 0 to UBound(arrLang)
	If InStr(1, Text, arrLang(i), 1) = 0 Then
		Text = Replace(Text, "[User]", arrLang(i), 1, 1, 1)
		exit for
	End If
next

Set objArgs = WScript.Arguments

If InStr(1, Text, objArgs(0), 1) Then
	Text = Replace(Text, objArgs(0), "[User]", 1, 1, 1)
	With CreateObject("Scripting.FileSystemObject")  
		.OpenTextFile(INI, 2).Write Text
		.OpenTextFile(INI, 1).Close
		End With 
End If

With CreateObject("Scripting.FileSystemObject")  
	.OpenTextFile(INI, 2).Write Text
	.OpenTextFile(INI, 1).Close
	End With 

Set objShell = Nothing 
WScript.Quit
Скорость выполнения таже. Да и понятно, что узкое место задержка цикла на 1 с. Выставил 0,5 с, сразу все стало гладенько. Посмотрим, как это отразится на работе ТС.
Возник вопрос. Запуск скрипта у меня получился только через указания интерпретатора vbs:

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

ShellExec /SW_HIDE /WAIT '%windir%\system32\cscript.exe' '"%script%" "%sect%"'
А можно-ли как-то запустить скрипт без указания интерпретатора?
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Наконец-то получилось...
И ведь хорошо получилось! :D Скрипт стал более компактным и, главное, выполняет свою задачу - обмен секциями с сохранением всех изменений. В принципе, если вывести названия секций в параметры и добавить документацию, получился бы отличный универсальный скрипт, который пригодился бы в любой сборке.
AkulaBig писал(а):Скорость выполнения таже. Да и понятно, что узкое место задержка цикла на 1 с. Выставил 0,5 с, сразу все стало гладенько.
Не понимаю я этой "горячки" на счет скорости в контексте этой задачи. ИМХО, ну не побежит пользователь сразу после смены языка в меню "Запуск", зачем ему это? :lol:

А скорость vbs, как ни крути, должна быть выше (au3-скрипт не выполнял всего того, что сейчас делает vbs, и чтобы выполнить au3 нужно было подгрузить AutoIt3.exe размеров в мегабайт). Но, может быть, вызов через ShellExec еще немного ускорит vbs, это надо попробовать:

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

ShellExec /SW_HIDE /WAIT:2000 %vbs% '"%params%"'
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):И ведь хорошо получилось! :D
Спасибо. Я-то всегда очень критично отношусь к своему коду.
Orion9 писал(а):выполняет свою задачу - обмен секциями с сохранением всех изменений.
Вернее обмен названиями секций. Тут еще важно, что скрипт-образец меняет только названия двух секций между собой. А у меня количество секций неограниченно. Только надо прописывать их названия. Ну и правильно вы заметили. Удобно, что все изменения в меню сразу-же сохраняются. Это очень удобно. Я уже оценил сам.
Orion9 писал(а):В принципе, если вывести названия секций в параметры
А как тогда вы узнаете, на каком языке текущая секция? С этим проблема. Поэтому я ищу название секции, которой нет. Значит этот язык и используется. Конечно есть неприятный момент. В файле обязательно должны присутствовать все названия секций. И в скрипте. И проверки-то особо не придумаешь.
Orion9 писал(а):универсальный скрипт, который пригодился бы в любой сборке.
С этим алгоритмом универсальный не получится. Но ведь перебить название не так и долго.
Orion9 писал(а): Не понимаю я этой "горячки" на счет скорости в контексте этой задачи. ИМХО, ну не побежит пользователь сразу после смены языка в меню "Запуск", зачем ему это? :lol:

Это понятно. Но я проверил на архивировании 8 Гб данных. Скорость не изменилась. Будет сильно грузить систему, изменю.
Orion9 писал(а): А скорость vbs, как ни крути, должна быть выше
Насколько я понимаю, задержка в цикле убивает любую скорость. Поэтому все скрипты начинают выполняться одинаково. То-есть скрипт быстренько выполнился. И ждет такое-же время, как и тот, что выполняется медленно.
Orion9 писал(а): нужно было подгрузить AutoIt3.exe
Есть нюансы. Например, в Песочнице Винды нет ядра wsh. А AutoIt3 будет гарантированно работать.
Orion9 писал(а):

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

ShellExec /SW_HIDE /WAIT:2000 %vbs% '"%params%"'
Вроде я так пробовал. Не работает. Ладно, попробую еще. Я сейчас внутрь сборки закинул csript.exe. Чтобы запускался интерпретатор нужной разрядности. Но он не будет работать, если в винде не установлено ядро wsh. Так что, наверное, проще прописать путь к Винде. Вроде-же в Вин х64 в любой ядро хранится в System32 и SysWOW64.

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

Действительно, все работает без прописки интерпретатора. Как всегда дело в кавычках.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Вернее обмен названиями секций. Тут еще важно, что скрипт-образец меняет только названия двух секций между собой.
Большинству пользователей именно это и нужно - смена двух-трех секций, т.е. отключение и обратное включение секции, как в случае с [Associations]. Просто вы взялись за более амбициозную задачу, при которой прописка всех секций в параметрах скрипта невозможна, и, видимо, придется делать как-то по-другому, если только вы действительно не пропишите в массиве arrLang все существующие на данный момент языки. Теоретически можно такое сделать, если создать пустые секции для отсутствующих языков, но мне кажется, это будет некоторым перебором.)
AkulaBig писал(а):А как тогда вы узнаете, на каком языке текущая секция? С этим проблема.
На мой взгляд, верный выход - хранить в самой секции информацию о языке, тогда ее ни с чем не перепутать:

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

[user]
Lang=rus
menu1=-Помощь
menu2=Справка 9.51 (ru)
...

[User_eng]
Lang=eng
menu1=-MS Windows
menu2=Calculator
...

[User_rus]
Lang=rus
menu1=-Помощь
menu2=Справка 9.51 (ru)
...
Правда пользователь должен знать об этом ключе, чтобы самостоятельно его добавлять к секции своего языка. Но этот способ надежен и позволит сразу считывать информацию о текущем языке и сохранять его перед пепреключением.

Можно еще попробовать создать в ini-файле отдельную секцию для хранения сведений о текущем языке, т.е.:

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

[Lang]
Active=rus
И отталкиваться от этого при переключении на новый язык. В общем, варианты есть :)
AkulaBig писал(а):С этим алгоритмом универсальный не получится. Но ведь перебить название не так и долго.
Если нужно поменять местами 2-3 секции, вполне получится, на мой взгляд. А перебить - дело нехитрое, только универсальности в этом никакой: для нескольких схожих задач придется держать несколько экземпляров одного и того же скрипта с небольшими вариациями.
AkulaBig писал(а):Это понятно. Но я проверил на архивировании 8 Гб данных. Скорость не изменилась. Будет сильно грузить систему, изменю.
Ну вы совсем что ли хотели устроить стресс-тест своему алгоритму? :lol: Очень может быть, что поток станет задерживаться при больших нагрузках на ЦП, и Sleep(1000) легко превратится в Sleep(1500) по факту. Но зачем пользователю при таких больших нагрузках в фоне переключать язык в ТС? )) Я думал, речь идет о скорости выполнения скрипта, а не задержках в цикле. Но можно попробовать и этим управлять с помощью функции GetCPUUsage:

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

cpu = GetCPUUsage()
If cpu < 10 Then
   Sleep(1000)
ElseIf cpu < 30 Then
   Sleep(800)
ElseIf cpu < 50 Then
   Sleep(700)   
Else
   Sleep(500)
Endif
Это была шутка, если что :lol: Но в Autorun таких шуток много можно придумать ))

P.S. А по поводу wsh я не стал бы париться. На компах, где админы не доставляют компоненты или запрещают политикой выполнение скриптов, сборкам ТС, имхо, делать нечего.)
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):пропишите в массиве arrLang все существующие на данный момент языки.
Как-раз в этом хитрость. Не надо прописывать сразу все языки. Можно их прописывать по мере необходимости. У меня-же сейчас только два языка прописано. И все работает. Надо будет третий прописать. Пропишу везде и все будет сразу работать.
Orion9 писал(а): На мой взгляд, верный выход - хранить в самой секции информацию о языке, тогда ее ни с чем не перепутать:
Самый наихудший вариант. В секции появляются непонятные записи. Секция User и Избранные каталоги вообще не факт, что такое проглотит. И, самое главное, вы сразу теряете возможность редактировать меню. Ведь запись у вас будет в текущую секцию. А как она появится в архивной секции. Подобные варианты я с самого начала попробовал. Не прокатило.
Orion9 писал(а): только универсальности в этом никакой: для нескольких схожих задач придется держать несколько экземпляров одного и того же скрипта с небольшими вариациями.
Ну уж скрипты не сотни мег размером. Переживем :)
Orion9 писал(а): Я думал, речь идет о скорости выполнения скрипта, а не задержках в цикле.
Я думаю время выполнения скрипта в обоих случаях ничтожно по сравнению с задержкой.
Orion9 писал(а): Но можно попробовать и этим управлять с помощью функции GetCPUUsage:
Дойдет до этого, применим.
Orion9 писал(а): P.S. А по поводу wsh я не стал бы париться. На компах, где админы не доставляют компоненты или запрещают политикой выполнение скриптов, сборкам ТС, имхо, делать нечего.)
Вообще у меня сборка ставится на системы без запроса админовских прав. Ну и дело не только в сборке. Акелька весь состоит из скриптов. И вот там без wsh совсем неудобно. И тут дело в том, что я свою сборку позиционирую как переносную. Поэтому хотелось-бы, чтобы она работала везде. По крайней мере другие инструменты я затачиваю под это.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Как-раз в этом хитрость. Не надо прописывать сразу все языки. Можно их прописывать по мере необходимости.
Да, я понял. Только пользователю придется самостоятельно тогда добавлять свой язык, если его там не окажется.
AkulaBig писал(а):Самый наихудший вариант. В секции появляются непонятные записи. Секция User и Избранные каталоги вообще не факт, что такое проглотит.
Возможно. Я исходил из того, как у меня сейчас реализована смена тем, но вполне вероятно, что вам такой вариант не подойдет. Кстати, Тотал довольно толерантно относится к "чужим" ключам в своих секциях - он просто их игнорирует. Так что проверить стоит, будет ли терятся возможность редактирования или не будет. Но раз вы уже проверили, то остается только второй вариант. Можно, кстати, вместо текущего языка сразу писать название текущей секции:

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

[Section]
Current=User_rus
AkulaBig писал(а):Дойдет до этого, применим.
Да что откладывать? Добавьте к циклу прямо сейчас перед Sleep или после него строчку ShowHint(GetCPUUsage()) и посмотрите. Loopback сделал классную функцию: всего одна строка - и проценты здесь:) Раньше для этого требовалось больше усилий: либо wmi-запрос из Autorun делать, либо отдельный скрипт вызывать и возвращать значение через stdout:
[cut="ProcessorTime.vbs"]

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

'https://learn.microsoft.com/en-us/windows/win32/wmisdk/monitoring-performance-data#using-raw-performance-data-classes

Set objShell = CreateObject("WScript.Shell")
Set objService = GetObject( "Winmgmts:{impersonationlevel=impersonate}!\Root\Cimv2")

Set objInstance1 = objService.Get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")
N1 = objInstance1.PercentProcessorTime
D1 = objInstance1.TimeStamp_Sys100NS

WScript.Sleep(575)

Set perf_instance2 = objService.Get("Win32_PerfRawData_PerfOS_Processor.Name='_Total'")
N2 = perf_instance2.PercentProcessorTime
D2 = perf_instance2.TimeStamp_Sys100NS

PercentProcessorTime = (1 - ((N2 - N1)/(D2-D1)))*100
if PercentProcessorTime < 0 then PercentProcessorTime = 0
WScript.Echo Round(PercentProcessorTime)
[/cut]
AkulaBig писал(а):И тут дело в том, что я свою сборку позиционирую как переносную. Поэтому хотелось-бы, чтобы она работала везде.
Ну, всем не угодишь. Мы как-то затрагивали этот вопрос: на мой взгляд, самое главное, что должно быть в сборке - это концепция. Так или иначе, сборка должна быть на кого-то (или на что-то) ориентирована. Тем, кто работает с фотографиями и дийзайном, например, нужно больше одно. Системщикам - другое. Обычным пользователям - третье. Главное определиться с задачами и целями, а не размазывать толстым слоем ненужные фичи. Потециал ТС накопил огромный, но раскрывать его весь, наверное, не имеет смысла. И уж тем более не нужно прикручивать к нему кучу ненужного софта, пусть и портабельного (хотя, наверное, и это кому-то подойдет).
Кстати, я тут почитал последние страницы топика сборок на руборде, почему вы так легко отказались от идеи встраивания MPC-BE в окно Листера? Мне, например, плеер от Гислера тоже пока не очень заходит. MPC на его месте был бы поинтереснее. Вы же вроде хорошо разбираетсь в этой теме (встраивания приложений в окно Листера): это вообще возможно? (буквально в двух словах, чтобы не сильно оффтопить).
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Сначала спрошу о главном. При выборе внутреннего английского в ТС меню устанавливается тоже внутреннее. Соответственно перестают работать мои кнопки на панели инструментов. То-есть задача прописать к внутреннему языку внешнюю MNU. Прописать проблем нет, но после выбора другого языка эти настройки сбрасываются. То-есть надо в Autorun еще прописывать меню для английского. Добавляю проверку в свою функцию:

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

RunThread ThreadWatchLang
Func ThreadWatchLang
	Global script = %COMMANDER_PATH% & "\Scripts\ChangeLang.vbs"
	Global ini = %COMMANDER_PATH% & "\Ini\User.ini"
	Global dest = "User"
	Local lng = AUTORUN_TCLANG

	While 1
		If AUTORUN_TCLANG = 'ENG' Then
			CommandExec em_changelng_mnu
		Endif

		If Not (lng = AUTORUN_TCLANG) Then
			Switch AUTORUN_TCLANG
				Case 'ENG'
					ChangeLang_eng
				Case 'RUS'
					ChangeLang_rus
			EndSwitch
			lng = AUTORUN_TCLANG
		Endif
		Sleep(500)
	Wend
EndFunc
Сама проверка:

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

If AUTORUN_TCLANG = 'ENG' Then
	CommandExec em_changelng_mnu
Endif
Сразу после While 1. И все. В меню теперь не зайти. Оно тикает. Что можно придумать?
Еще вопрос давно хочу задать. А результат выполнения операций можно как-то посмотреть? Я как-бы понимаю, что есть OutputDebugString. Но вообще не понял, куда что выводится. А тот-же MessageBox здесь не возможно использовать. Он промелькивает на экране и даже на видео не понятно, что там выводится.
Orion9 писал(а):Только пользователю придется самостоятельно тогда добавлять свой язык, если его там не окажется.
Пользователь никак не сможет добавить свой язык. Так как то, что я делаю сейчас, это всего-лишь маленькая толика того, что предстоит сделать. Поэтому только я смогу добавить другой язык. Еще ведь и при сборке инстляхи будет выбор языка.
Orion9 писал(а): Но раз вы уже проверили
Не, я проверял только работу с тремя секциями. Работу с левым ключом я не проверял.
Orion9 писал(а): Да что откладывать?
Как всегда на это нет времени. Сейчас надо начинать меню Избранных каталогов делать многоязычным.
Orion9 писал(а): Кстати, я тут почитал последние страницы топика сборок на руборде, почему вы так легко отказались от идеи встраивания MPC-BE в окно Листера?
Я не отказался. Просто такую жирноту нельзя делать в виде отдельного плагина.
Надо очень-очень хорошо продумать его использование. Ведь внутренний плеер ТС эти-же кодеки и использует. Знчит если использовать МПЦ, надо обязательно делать совместное использование его кодеков с ТС. Но они лежат в разных папках. Вот если решить эту проблему, тогда можно и о плагине подумать.
Orion9 писал(а): это вообще возможно?
Это надо разбираться. У каждого приложения свои нюансы. Например, я не смог встроить приложения, где используется класс TApplication. Никак не удается закрыть второй экземпляр приложения, который они создают. В общем нельзя написать оболочку, которая тупо будет запускать любые проги в качестве плага.
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Прописать проблем нет, но после выбора другого языка эти настройки сбрасываются. То-есть надо в Autorun еще прописывать меню для английского
Что-то становится все сложнее и сложнее. Может все-таки Гислера попросить, чтобы сделал как надо? Всего-то нужно секцию [user] перенести из Wincmd.ini в WCMD_RUS.INI, не смотря на то, что этот языковой ini используется для em_* команд. Можно и не переносить вовсе, а просто добавить возможность сохранения в нём секции меню "Запуск", которая будет иметь приоритет над секцией из wincmd.ini.
AkulaBig писал(а):И все. В меню теперь не зайти. Оно тикает. Что можно придумать?
Все-таки надо было еще код em_ команды приложить, чтобы я увидел, но, может быть, вот так заработает?
[cut]

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

RunThread ThreadWatchLang
Func ThreadWatchLang
   Global script = %COMMANDER_PATH% & "\Scripts\ChangeLang.vbs"
   Global ini = %COMMANDER_PATH% & "\Ini\User.ini"
   Global dest = "User"
   Local lng = AUTORUN_TCLANG, cpu, mls

   While 1
      If Not (lng = AUTORUN_TCLANG) Then
         Switch AUTORUN_TCLANG
            Case 'ENG'
               ChangeLang_eng
               CommandExec em_changelng_mnu
            Case 'RUS'
               ChangeLang_rus
         EndSwitch
         lng = AUTORUN_TCLANG
      Endif
      #Sleep(500)
      cpu = GetCPUUsage()
      If cpu < 10 Then
         mls = 1000
      ElseIf cpu < 30 Then
         mls = 800
      ElseIf cpu < 60 Then
         mls = 700
      Else
         mls = 500
      Endif
      OutputDebugString("Autorun: mls = " & mls)
      Sleep(mls)
   Wend
EndFunc 
[/cut]
Я добавил туда GetCPUUsage. Шутка шуткой, но код-то рабочий :lol:
AkulaBig писал(а): Но вообще не понял, куда что выводится. А тот-же MessageBox здесь не возможно использовать. Он промелькивает на экране и даже на видео не понятно, что там выводится.
C MessageBox есть проблемы в 64-битной версии ТС. Попробуйте 32-разрядную, может сработать. OutputDebugString должна выводить результат в окно DebugView без танцев. Может, у вас просто "захват" (capture) остановлен?
AkulaBig писал(а):Еще ведь и при сборке инстляхи будет выбор языка.
А, понятно тогда.
AkulaBig писал(а):В общем нельзя написать оболочку, которая тупо будет запускать любые проги в качестве плага.
Спасибо за разъяснение. У меня, наверное, очень наивный взгляд на такие вещи (тут ведь надо знать, а не просто мечтать), но я исходил еще из того, что исходники к МПЦ есть и сам автор тоже на руборде вроде присутствует: быть может, можно было как-то все это адаптировать под требования ТС, если оно, конечно, вам (и не тольуо вам) нужно и реалистично в плане реализации.
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):Может все-таки Гислера попросить, чтобы сделал как надо?
Гислера можно до посинения просить. Ничего он делать не будет. Проверено. Так что даже не рассматриваю этот вариант.
Orion9 писал(а):Все-таки надо было еще код em_ команды приложить
Да это просто установка используемого меню:

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

[em_changelng_mnu]
cmd= OPENLANGUAGEFILE WCMD_ENG.MNU
Orion9 писал(а):может быть, вот так заработает?
Так я сразу попробовал. Проблема в том, что этот код не работает при переключении с внешнего английского на внутренний. Поэтому и приходится за пределы этого блока сравнение выносить.
Orion9 писал(а):C MessageBox есть проблемы в 64-битной версии ТС.
Понятно.
Orion9 писал(а):Может, у вас просто "захват" (capture) остановлен?
Разберусь. С первого раза я его не смог освоить.
Orion9 писал(а):исходники к МПЦ
[cut]
Это никак не влияет на написание плагина. Вон у SumatraPDF вообще есть функция для использования плагином. В последних версиях она такая кривая. А автору пофиг. Поэтому пришлось использовать обходные пути.
Orion9 писал(а):и сам автор тоже на руборде вроде присутствует
И это тоже мало на плагин влияет.
Orion9 писал(а):если оно, конечно, вам (и не тольуо вам) нужно
В том-то и дело, что от плагино-писателя это никак не зависит. В этом должен быть заинтересован автор проги, в том числе и ТС. Ведь именно автор дает доступ к функциям. А в основном авторы на все просьбы отвечают нет.
Ладно, будем после Рождества думать, как победить тики. Но для этого обязательно надо разобраться с DebugView.
Кстати, я быстро глянул настройки МПЦ. Вроде его можно натравить на внешние кодеки. Ведь в K-Lite Codec Pack он использует внешние кодеки. Так что, скорей всего, можно его прикрутить. Но это будет очень не скоро.
[/cut]
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Гислера можно до посинения просить. Ничего он делать не будет.
Это я уже понял :) Но здесь явная его недоработка, а свои косяки надо подчищать. На главной странице заявлено:
Two file windows side by side
Multiple language and Unicode support
Enhanced search function
...
Но по факту многоязыковой поддержки нет: пользователь переключает в настройках язык, а часть меню у него не переключается, это как? :)
AkulaBig писал(а):Проблема в том, что этот код не работает при переключении с внешнего английского на внутренний.
Может, я что-то не понимаю, но вроде же работает:
[cut]

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

Global script = %COMMANDER_PATH% & "\Scripts\ChangeLang.vbs"
Global ini = %COMMANDER_PATH% & "\Ini\User.ini"
Global dest = "User"

RunThread ThreadWatchLang

Func ThreadWatchLang
   
   Local sect, cpu, mls, lng1, lng2 
     
   lng1 = AUTORUN_TCLANG
   While 1   
      lng2 = AUTORUN_TCLANG
      If Not (lng1 = lng2) Then
         Switch lng2
            Case 'ENG'
               sect = "[User_eng]"
               CommandExec em_changelng_mnu
               Sleep(50)
            Case 'RUS'
               sect = "[User_rus]"
         EndSwitch
	 ShellExec /SW_HIDE /WAIT '%windir%\system32\cscript.exe' '"%script%" "%sect%"'
	 CommandExec cm_ReloadBarIcons         
         lng1 = lng2
      Endif

      cpu = GetCPUUsage()
      If cpu < 10 Then
         mls = 1000
      ElseIf cpu < 35 Then
         mls = 850
      ElseIf cpu < 60 Then
         mls = 700
      Else
         mls = 500
      Endif
      OutputDebugString("Autorun: mls = " & mls & " lng1 = " & lng1 & " lng2 = " & lng2)
      Sleep(mls)
   Wend
EndFunc 
[/cut]
Я немного изменил код, если вы не против. Глобальные переменные можно вынести из тела функции, а от двух вспомогательных функций ChangeLang_ можно избавиться, т.к. они практически идентичны и меняют только название секции. Переменная lng2 сокращает количество вызова макроса AUTORUN_TCLANG, чтобы лишний раз не читать ini. Ну и GetCPUUsage тоже добавил (цифры навскидку). OutputDebugString все исправно выводит, я не заю в чем у вас может быть проблема. Попробуйте на другой системе запустить и проверить. В общем, вроде все работает.

[cut="MPC"]
AkulaBig писал(а):В этом должен быть заинтересован автор проги, в том числе и ТС. Ведь именно автор дает доступ к функциям.
Именно поэтому я и подумал, что хорошо, что все коды открыты и автор доступен. Ведь было бы хуже, если исходников не было и автор был бы не русскоязычным.[/cut]
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а):Но здесь явная его недоработка, а свои косяки надо подчищать.
Сначала его надо убедить, что это косяк. А вообще я выше писал, что конкретно про STARTMENU и Избранные каталоги я ему писал. Он меня послал подальше.
Orion9 писал(а): Но по факту многоязыковой поддержки нет
Вот именно. Видимо его это устраивает. А может на ус намотал и будет думать. Он может вносить изменения даже без просьбы. Просто по факту обсуждения на форуме.
Orion9 писал(а): Я немного изменил код, если вы не против.
Понятно, что у меня код не оптимизирован. Для этого хотя-бы надо внимательно справку прочитать. А так и не понял, можно-ли писать много строк в условиях. Увидел, что у вас функция вызывается решил, что в If и Case может быть только одна строка. Теперь вижу, что синтаксис похож на vbs. Так что очень хорошо, что вы не поленились оптимизировать код.
Orion9 писал(а): OutputDebugString все исправно выводит, я не заю в чем у вас может быть проблема.
Проблема одна. Надо изучить, как работает DebugView :)
[cut]Важно, чтобы МПЦ поддерживал относительные пути к кодекам. [/cut]

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

Проверил. Все отлично работает. Конечно кроме:

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

CommandExec em_changelng_mnu
Я выше писал. Хитрость в том, что когда переключается с внешнего английского на внутренний или наоборот, конечно этот код не будет выполняться. Вот я и хотел его вывод посмотреть. Запустил DebugView. Все само работает без всяких настроек. Видимо в прошлый раз вывод неправильно был написан.
Надеялся вдруг внутренний и внешний английский как-то по разному обозначаются хоть чем-то. Но нет, отследить не удастся. То-есть код CommandExec em_changelng_mnu должен быть вынесен за пределы условия. Попробую, вдруг сейчас тикать не будет.
Проверил и изменение времени задержки. Запустил упаковщик и все режимы посмотрел. Работает. Правда изменил ваши цифорки. У вас получилось, что чем меньше нагрузка, тем больше задержка.

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

Вот теперь все отлично работает:

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

		Else
			If AUTORUN_TCLANG = 'ENG' Then
				IniRead MainMenu %COMMANDER_INI% "Configuration" "Mainmenu"
					If MainMenu = "" Then
						CommandExec em_changelng_mnu
				EndIf
			EndIf
		EndIf
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Теперь вижу, что синтаксис похож на vbs.
Да, действительно чем-то похож. А еще похож на Autohotkey v2, чем мне очень нравится :)
AkulaBig писал(а): Правда изменил ваши цифорки. У вас получилось, что чем меньше нагрузка, тем больше задержка.
Я думал, что именно это и нужно! А цифорки просто для примера (там ведь надо серьезные тесты проводить, а не прорсто от балды их брать))
AkulaBig писал(а):Вот теперь все отлично работает:
А вот здесь я, видимо, так и не понял, что было нужно, но очень рад, что у вас получилось! :) Autorun способен помочь в трудную минуту. Теперь вам осталось еще [DirMenu] прикрутить таким же образом, и дело в шляпе ))

[cut="MPC"]
AkulaBig писал(а):Важно, чтобы МПЦ поддерживал относительные пути к кодекам.
Упс... Видимо, я все-таки поспешил. Давненько не заходил в каталог MPC-BE, а там, оказывается, LAV-фильтры вшиты в сам mpc-be.exe. Я помнил, что у них был standalone_filters-mpc-be.7z, поэтому и подумал, что само приложение не должно быть большим, и раз у все-равно приходится добавлять эти кодеки в каталог ТС, то было бы неплохо иметь плагин MPC-BE на их основе как альтернативу встроенному плееру. Но mpc-be.exe сечас 27 МБ! И это еще без дополнительных файлов :)[/cut]
AkulaBig
Сообщения: 639
Зарегистрирован: Ср дек 03, 2008 11:48

Сообщение AkulaBig »

Orion9 писал(а): А вот здесь я, видимо, так и не понял, что было нужно
У встроенного английского свое встроенное меню и своя встроенная панель инструментов. Соответственно когда переключаешься на встроенный английские пользовательские кнопки ПИ перестают работать. Скорей всего и пользовательские пункты меню не будут работать. Я просто стандартное меню использую, поэтому точно не знаю.
Для того, чтобы все работало, надо к внутреннему английскому привязать внешнее меню. Тогда и inc языка будет работать.
Вот это я и делал. Но так, как у вас команда была прописана, она не реагировала на изменение языка, когда с английского внешнего переключался на английский внутренний или наоборот. Ведь в переменной всегда был ENG в этом случае. То-есть команду надо запускать не в условии. Но тогда она начинала исполняться каждые сколько-то миллисекунд и меню начинало тикать в такт. В меню стало невозможно зайти. А сейчас я проверяю, прописано-ли в инишнике внешнее меню. И только если не прописано, я запускаю команду. Все, тик меню исчез.
Надеюсь понятно объяснил?
[cut="MPC"]Давненько не заходил в каталог MPC-BE, а там, оказывается, LAV-фильтры вшиты в сам mpc-be.exe.файлов :)[/cut]
[cut]
Зато в MPC-HC не вшиты. Но все равно вес неплохой. Но ради полной портабельности ТС можно пожертвовать. Настройки в ини поддерживаются. Внешние кодеки поддерживаются. Но надо разбираться. Почему-то из LAV схавал только ax, хотя написано, что и dll подхватывает. Соответственно не все файлы смог проиграть. С другой стороны к MPC-BE целый пак ax прилагается. Наверное можно его подключать. Ну и внешние кодеки прописаны с абсолютными путями. Так-то это решаемый вопрос.
[/cut]
Аватара пользователя
Orion9
Сообщения: 1283
Зарегистрирован: Пн янв 01, 2024 17:18

Сообщение Orion9 »

AkulaBig писал(а):Все, тик меню исчез.
Надеюсь понятно объяснил?
Да, теперь, кажется, понял :) Не думал, что вас могут ждать такие "сюрпризы", впрочем, как всегда: гладко было на бумаге, да забыли про овраги)

Скачал сборку, посмотрел. Еще немного и пробьёте первую сотню строк на Autorun! :lol: Мои поздравления!

P.S. И спасибо за комментарии по поводу MPC.
Ответить