Autorun

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

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

Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):Если речь про инкремент результата WM_USER+1000, то да, можно.
Речь про все текущие в момент кликов хэндлы. И текущий инкремент для 9 текущих пар.
Ну, и про 0 для активного окна ТС безотносительно положения указателя мыши ты не ответил.
Loopback писал(а):ввести виртуальные идентификаторы типа 3 и 4, т.е. например для панели табов: 100 - активная панель табов, 101 - неактивная
Не понял. Какая связь у 3/4 со 100/101 ?
Я думал о добавке 9 индексов, но сперва мне такой вариант показался избыточным. И тебе тогда переменную с индексом придётся отдельно обрабатывать, а не подставлять сразу заданный. Впрочем, хозяин — барин, главное, чтобы работало.
Loopback писал(а):Элемент затеняется, но маркер не убирается.
У меня и затенения не происходит. А там не осветление с вдавленностью? Я так понял на скриншоте это ===Separator===.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Бета-версия 2.0.10

+ Tweaks: добавлены новые виртуальные идентификаторы для задания пар активных/неактивных элементов
+ Tweaks: добавлена поддержка зон главного окна (заголовок, меню и т.д.)
+ в выражениях добавлена прямая поддержка команд, возвращающих выражения, в виде: StrPos(["switch",] str, substr)

На этом с обновлением выражений, полагаю, можно закончить, лучше в этом синтаксисе на этом "движке" уже ничего с ними не сделать. Такой путь развития очень напомнил AHK - такая же лапша из команд и функций, в разных условиях задаваемых разными способами (одна из причин, почему я не люблю AHK первой версии). Ну тут уже ничего не поделаешь без полной переделки с потерей совместимости.

Вкратце выглядит сейчас всё так:

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

# 1. При использовании выражений в параметрах, можно использовать % непосредственно перед кавычками.
# Содержимое строки будет вычисляться и результат передаваться в параметр.
Set sl 1000
Sleep %'%sl%+500'
# => 1500

# 2. Внутри кавычек для текстовых констант можно использовать кавычки другого типа
Set sl 1000
StrLen var %'"Строка_" & 1'
# var => Строка_1

# 3. В выражениях можно использовать команды Autorun, возвращающие значения, 
# в виде StrPos(["switch",] str, substr). 
# При таком использовании первый параметр (переменная) не нужен.
# Команды могут быть вложенными.
Set zz "  abcdefgh"
MsgBox %"StrLeft(StrTrim(%zz%), 3) & '-' & StrPos(%zz%, 'd') & '-' & (StrPos('123456789', '5'))" "Expr"
# => abc-6-5

# 4. Если в команде ужно использовать переключатели, их можно передать в первом параметре в кавычках через пробел, первым символом в строке должен идти ~, вторым /: "~/S1 /S2" и т.д.
Set zz "AbCdEfxQWERTY"
MsgBox %"StrPos('~/S', %zz%, 'x')" "Case-sens"
# => 7

# 5. В условиях "окавычивать" выражения не нужно, выражения вычисляются по умолчанию
Set zz "snsddxff"
if StrPos('~/S', %zz%, 'x') = 6 then
  MsgBox "Yes"
endif
Flasher писал(а):Речь про все текущие в момент кликов хэндлы. И текущий инкремент для 9 текущих пар.
Текущие получались уже в прошлой версии.

В общем, я уже утомился препираться по этому вопросу. Опять больше времени трачу на развернутые ответы, чем на собственно программирование.
Flasher писал(а):Ну, и про 0 для активного окна ТС безотносительно положения указателя мыши ты не ответил.
Есть, можно назначать обработку на разные зоны.
Flasher писал(а):Я думал о добавке 9 индексов, но сперва мне такой вариант показался избыточным. И тебе тогда переменную с индексом придётся отдельно обрабатывать, а не подставлять сразу заданный. Впрочем, хозяин — барин, главное, чтобы работало.
Не всегда то, что кажется избыточным, таковым является: c точки зрения скорости и простоты обработки этот вариант лучший. И не всегда то, что кажется простым, просто на самом деле (это про "переменную" @).
Сейчас код переключения вкладок такой:
#10017 - активная панель вкладок
ControlSetMouseAction /W:R 10017 CMD 3005
ControlSetMouseAction /W:F 10017 CMD 3006
Flasher писал(а):У меня и затенения не происходит. А там не осветление с вдавленностью? Я так понял на скриншоте это ===Separator===.
Вид зависит от темы, на классической вдавленный серый текст, в десятке просто серый. В любом случае пункт неактивный.
Я не знаю, почему у тебя не затеняет. Может меню не видимо при запуске ТС? В таком случае помочь ничем нельзя.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):+ в выражениях добавлена прямая поддержка команд, возвращающих выражения, в виде: StrPos(["switch",] str, substr)
Да ладно?! :o Опять 7 лет, но уже сделал то, что категорически не хотел делать. :shock:
Loopback писал(а):Один раз я такое исключение уже сделал, когда добавил функции, которые можно использовать в выражениях (вариант, кстати, очень ограниченный). Больше таких ошибок делать не буду.
...
Вычислений на месте тоже не будет. Отдельная конкатенация в Autorun вообще не нужна, переменные разворачиваются в тексте.
...
Это бессмысленная трата времени и нагромождение кучи кода, поскольку имеющийся парсер принципиально не может решить задачу работы с ними. А ради чего? Ради нескольких функций, которые будут использоваться в лучшем случае пару раз на скрипт?
...
Угу, т.е. я сейчас начну переписывать с нуля парсер, только чтобы сделать красиво строчные функции? Здорово придумано :D
...
Т.е. под каждый вид функционала свой парсер. Нет, это не вариант. Всё должно обрабатываться единообразно.
Рад, что не сдержал обещания и явно подобрел с возрастом. :)
Loopback писал(а):Вкратце выглядит сейчас всё так:
Это круто. Удобно. Изображение Потестирую.
Loopback писал(а):Текущие получались уже в прошлой версии.
Прекрасно. )
Loopback писал(а):Есть, можно назначать обработку на разные зоны.
Без /H берёт только клиентскую часть, а хотелось бы всё окно. Но желательно, если это возможно, и за его пределами, т. е. чтобы клики с клавишными модификаторами не переключались на окно под указателем, как если бы мы жали только клавишные хоткеи. Или это сложно?
И возможность комбинировать зоны по сумме флагов тоже не помешала бы. Т. е. не 1, 2, 3, ..., 20, а 1, 2, 4, 16 ... как для ключей ini (c вычислением по логическому "И"). В таком виде /H:1 /H:2 пока тоже не работает.
А с /R так и не вышло что-то сделать?:

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

ControlSetMouseAction /R /H:2 /K:C 0 CMD 321
Loopback писал(а):c точки зрения скорости и простоты обработки этот вариант лучший.
ОК. А можно объяснить, почему такие странные числа (10001-10018) выбраны?
Loopback писал(а):Я не знаю, почему у тебя не затеняет. Может меню не видимо при запуске ТС? В таком случае помочь ничем нельзя.
Нет. Меню скрываю только со всем остальным по F11. Может, это связано с тем, что в заголовках присутствуют юникодные символы (типа как под 3-м пунктом)?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Flasher писал(а):Опять 7 лет, но уже сделал то, что категорически не хотел делать.
Ну, наверно лучше не обещать, но сделать, чем наоборот? :wink:

Да, не планировалось. Но эти вычисления с /С потянули за собой столько всего... Что проще оказалось пару вечеров посидеть с парсером выражений. Мне и сейчас не особо нравится, как всё реализовано, но переделывать с нуля явно сложнее. Хотя иногда и хочется :)
Flasher писал(а):Без /H берёт только клиентскую часть, а хотелось бы всё окно. Но желательно, если это возможно, и за его пределами, т. е. чтобы клики с клавишными модификаторами не переключались на окно под указателем, как если бы мы жали только клавишные хоткеи. Или это сложно?
Без /H оно вообще не планировалось и сейчас там нечто неопределенное получается. Но может быть можно окно и целиком задействовать.

Для перехвата за пределами окна приложения, насколько я понимаю, нужен глобальный хук. Это уже выходит за пределы назначения плагина, делать его не планируется.
Flasher писал(а):И возможность комбинировать зоны по сумме флагов тоже не помешала бы. Т. е. не 1, 2, 3, ..., 20, а 1, 2, 4, 16 ... как для ключей ini (c вычислением по логическому "И"). В таком виде /H:1 /H:2 пока тоже не работает.
Эти флаги напрямую устанавливаются. И они не комбинируются. Наверно можно и сделать, правда тогда придется уйти от прямого задания индекса зоны. Понять бы зачем.
Flasher писал(а):А с /R так и не вышло что-то сделать?:
Если про подавление меню - нет.
Flasher писал(а):ОК. А можно объяснить, почему такие странные числа (10001-10018) выбраны?
Честно - с потолка. Ну вдруг Кристиан еще что-нибудь надумает сделать. Это чтобы потенциально не пересечься. Хотя и этот выбор не дает гарантий, конечно.
Flasher писал(а):Может, это связано с тем, что в заголовках присутствуют юникодные символы (типа как под 3-м пунктом)?
Не знаю, но сомневаюсь. Сравнение производится элементарно - из начала текста берется количество символов = длине маркера и сравнивается.

Какая в принципе теперь разница, если схема все равно не работает с кастомными меню.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):Ну, наверно лучше не обещать, но сделать, чем наоборот?
Ну и между "не обещать" и "утвердительно обещать не делать" знак равенства не поставишь. ;)
Loopback писал(а):Хотя иногда и хочется
Понимаю тебя. Ты не раз этот момент по всем трём своим суперплагинам затрагивал.
Loopback писал(а):Но может быть можно окно и целиком задействовать.
Хотелось бы.
Loopback писал(а):нужен глобальный хук. Это уже выходит за пределы назначения плагина
Ясно. Не так страшно. Мне в основном это пригодилось бы в ситуации, когда указатель случайно оказывается на всплывающих панелях (таскбар, TLB). С другой стороны, без глобального хука, видимо, ситуацию с /X1|2 не исправить.
Loopback писал(а):Наверно можно и сделать, правда тогда придется уйти от прямого задания индекса зоны. Понять бы зачем.
Ну как зачем. Допустим:
• Заголовок + кн. системного меню + кнопки управления
• Клиентская область + разделитель панелей + главное меню
Да и для контролов такое точно не помешает (например, все компоненты источника или получателя). Можно в перечислении через запятую или вертикальную черту, если не суммой делать.
Loopback писал(а):Если про подавление меню - нет.
MVV точно знает как быстро подавлять отрисовку (в своих утилитах делал). Можешь у него спросить.
Loopback писал(а):Честно - с потолка. Ну вдруг Кристиан еще что-нибудь надумает сделать. Это чтобы потенциально не пересечься.
Так и думал. Можно ещё было отрицательными, но маленькими сделать. )
Loopback писал(а):Какая в принципе теперь разница, если схема все равно не работает с кастомными меню.
А переделать не пробовал?
Loopback писал(а):Но в любом случае, функцию можно убирать, или нужно переделывать.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Среди бурного обсуждения умных вещей так и не понял одного... А что изменилось в назначении/обработке переменных в последних двух бетах?
Раньше (до 2.0.8 включительно) было так:
SetEnv ADMIN *
Создавалась переменная ADMIN, которой присваивалось значение *.
А сейчас как нужно? C ShellExec тоже что-то изменилось?
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD писал(а):Создавалась переменная ADMIN, которой присваивалось значение *.
И сейчас создаётся.
LonerD писал(а):C ShellExec тоже что-то изменилось?
Никаких проблем не наблюдаю.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Flasher писал(а):И сейчас создаётся.
В том-то и дело, что нет. Заменяю один wdx файл на 2.0.8, запускаю Тотал - переменная есть. Заменяю на 2.0.10, запускаю Тотал - нету. Autorun.cfg при этом один и тот же.
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

LonerD писал(а):В том-то и дело, что нет.
Я же не от балды пишу, а проверяю. См. в x32 версии.
Вызов cmd /k set admin из комстроки даст ADMIN=* .
У тебя, вероятно, какой-то обрыв в условиях. MsgBox test прямо перед этой командой вставь и проверь.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Flasher писал(а):Хотелось бы.
Ок, без /H будет применяться к окну целиком.
Flasher писал(а):Ну как зачем. Допустим:
Ок, в принципе можно и так. Для частей одного целого это имеет определенный смысл.
Flasher писал(а):Да и для контролов такое точно не помешает
Для контролов нет.
Flasher писал(а):знает как быстро подавлять отрисовку
Да я как бы идею представляю, но не так это просто. Меню системные (в заголовке например) прибил, там просто был косяк один. Наверно, это может решить и проблему с кнопками х1,х2. Вот с меню тоталовскими (на тулбаре, например) сложнее, не уверен, что оно стоит возни.
Flasher писал(а):А переделать не пробовал?
Нет. Тут, собственно, совсем мало вариантов остается, либо индексы (точно нет), либо просто поиск по тексту.

LonerD
В самом деле странно, у себя тоже попробовал - все создается. Код команды не менялся, ShellExec тем более.

Может где-то в другом месте что-то с выражениями? В них баги могут быть вполне.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback писал(а):Ок, без /H будет применяться к окну целиком.
Ок, в принципе можно и так.
Отлично.
Loopback писал(а):Наверно, это может решить и проблему с кнопками х1,х2.
Не терпится проверить. :)
Loopback писал(а):не уверен, что оно стоит возни.
Если учитывать, что правую кнопку удобно использовать в качестве модификатора (гор. прокрутка в ScrollTC как пример), то, видимо, стоит.
Loopback писал(а):либо просто поиск по тексту.
Меня устроит. По паре \t или пробелов. А ты ищешь в mnu или в интерфейсе? Если в mnu, то самое простое — это по командному идентификатору в конце после запятой. Там достаточно 0 вместо команды прописать.

Кстати, в англ. справке знаки вопроса на страницах Basics > Syntax > Basics (снизу) и SysInfo > Commands > GetSysColor имеются.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Loopback писал(а):Может где-то в другом месте что-то с выражениями?
Действительно, не конкретно в этом была проблема, но где-то в предшествующих секциях.
Сократил autorun.cfg до такого размера, который работает в 2.0.8, но не работает в 2.0.10 (не назначается переменная DLADMIN и не запускается ехе-шник).

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

LoadLibrary Plugins\Autorun_Sysinfo.dll
SetEnv /EV TCPL %commander_path%\Plugins

SetEnv DLOSVERS w6
If %sysinfo_osversion% = WIN_XP Then
  SetEnv DLOSVERS w5
EndIf

SetEnv DLOSISXP
If %DLOSVERS% = w5 Then
  SetEnv DLOSISXP XP
EndIf

SetEnv DLADMIN *
If %DLOSVERS% = w5 Then
  SetEnv DLADMIN
EndIf

ShellExec /W "%TCPL%\exe\TCLair\TCLair.exe" "" ""
Windows 11 | TC DreamLair eternal pre-α
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Flasher писал(а):Если учитывать, что правую кнопку удобно использовать в качестве модификатора (гор. прокрутка в ScrollTC как пример), то, видимо, стоит.
Ладно, время будет - покопаю.
Flasher писал(а):А ты ищешь в mnu или в интерфейсе?
В уже созданном меню, конечно. Собственно, идея в том и была, чтобы не парсить меню.

LonerD
А никаких сообщений об ошибках разве не выдавалось?

Спасибо за тест, проблему нашел, как и думал в условиях: переменная в выражении бралась только внутренняя, а нужно было еще смотреть переменные окружения. Вечером выложу исправленную версию.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

Бета-версия 2.0.11

* Tweaks: изменен синтаксис ControlSetMouseAction, вместо CMD/EMCMD используются встроенные команды Autorun
+ Tweaks: в ControlSetMouseAction зоны главного окна могут суммироваться
* Tweaks: действие по умолчанию (например, контекстные меню) не выполняется, если на эту кнопку назначено своё действие
- исправлена проблема с получением переменных окружения в выражениях

Внимание! Синтаксис ControlSetMouseAction поменялся!

Теперь вместо CMD/EMCMD можно использовать внутренние команды Autorun в соответствии с их синтаксисом.

Теперь при назначенной команде стандартное действие (например, контекстное меню при /R) не выполняется.

В более сложных случаях (например, колесо при модификаторе /K:R, на контроле, имеющем контекстное меню), чтобы меню не появлялось, надо "заглушить" стандартное действие, создав запись с пустым действием. Например, переключение вкладок колесом при нажатой правой кнопке:

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

ControlSetMouseAction /R 10017
ControlSetMouseAction /W:R /K:R 10017 SendCommand 3005
ControlSetMouseAction /W:F /K:R 10017 SendCommand 3006
Меню при этом доступно не будет.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Loopback
Ничего толком не завелось. Весь конфиг:

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

LoadLibrary Plugins\Autorun_Tweaks.dll
# Никакой реакции на прокрутку вкладок над активной панелью:
ControlSetMouseAction /W:R /K:R 10017 SendCommand 3005
ControlSetMouseAction /W:F /K:R 10017 SendCommand 3006
ControlSetMouseAction /W:R 10017 SendCommand 3005
ControlSetMouseAction /W:F 10017 SendCommand 3006
# Тут только меню мелькает на заголовке, команда не выполняется:
ControlSetMouseAction /R /H:62 /K:A SendCommand 321
# Тут даже меню не пропадает:
ControlSetMouseAction /R /H:62 /K:C SendCommand 321
# Только дефолтный переход по истории каталогов, команды не выполняются:
ControlSetMouseAction /X1 /H:0 SendCommand 321
ControlSetMouseAction /X2 /H:0 SendCommand 322
Win7 x32, TC 9.51 RC6 x32 с одним плагином Autorun, служба Темы отключена, все резидентные программы (кроме чисто системных), браузеры и редакторы отключены. Для чистоты эксперимента даже Realtek и Nvidia (включая службы) отключил/остановил.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить