Autorun

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

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

Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

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

P.S. Интересно звучит задачка.
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Другими словами немного подробней.
Есть мой Тотал, настроенный. В Autorun прописан запуск программы, она запускается и работает в фоне. Я могу запускать несколько копий моего Тотала и закрывать их. Всё это время программа должна быть запущена. Когда я закрою последнюю копию моего Тотала - программа должна выгрузиться.
В то же время параллельно я могу запускать чистый Тотал или чужие сборки. Они никак не должны влиять на запуск и закрытие программы.

PS. В моём случае нужная "программа" - это скомпилированный скрипт. Задача на таком уровне решаемая - запоминать или записывать в отдельный файл все PID запускаемого процесса ТС и время от времени опрашивать их. Если все PID выгружены - то выгружается и программа-скрипт.
Но пока не стал усложнять и сделал просто - программа работает до тех пор, пока запущено хоть одно окно любого ТС. :lol:
Windows 11 | TC DreamLair eternal pre-α
Skif_off
Сообщения: 1252
Зарегистрирован: Ср ноя 28, 2012 13:44

Сообщение Skif_off »

LonerD писал(а):... мой Тотал ... несколько копий моего Тотала ...
Т.е. "мой" лежит в конкретной папке, любой не-"мой" - в любом другом каталоге?
LonerD писал(а):запоминать или записывать в отдельный файл все PID запускаемого процесса ТС и время от времени опрашивать их. Если все PID выгружены - то выгружается и программа-скрипт.
Как-то всё вместе не очень понятно звучит :), скрипт сам запускает все другие копии ТС или он для другого? Если второе, то получать и хранить список PID как-то расточительно, на AutoIt добавил бы в скрипт что-то типа такого:

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

#NoTrayIcon

#include "WinAPIEx.au3"

; Регистрируем функцию проверки процессов
AdlibRegister("CheckProc", 3000)

Local $sTCExe = _WinAPI_GetProcessFileName($CmdLine[1])
Local $sTCPath = StringRegExpReplace($sTCExe, "\\[^\\]+$", "\")
Local $iTCNameLen = StringLen($sTCPath)

; Тут собственно скрипт

Func CheckProc()
    AdlibUnRegister("CheckProc")
    Local $sTmp
    Local $iCount = 0
    Local $aProcList = ProcessList()
    For $i = 1 To $aProcList[0][0]
        If StringMid($aProcList[$i][1], 1, 8) = "TOTALCMD" Then
            $sTmp = _WinAPI_GetProcessFileName($aProcList[$i][0])
            If StringMid($sTmp, 1, $iTCNameLen) = $sTCPath Then
                $iCount += 1
                ExitLoop
            EndIf
        EndIf
    Next
    If $iCount = 0 Then Exit
EndFunc
$CmdLine[1] - PID родительского ТС, получаем от Autorun и используем для получения каталога TC из полного имени исполняемого файла, раз в 3 секунды перебираем PID'ы, смотрим, где лежат исполняемые файлы и сравниваем.
Если скрипт что-то пишет, то Exit, наверное, стоит заменить на переменную и обрабатывать ее в основном теле скрипта.
ProcessList() можно запускать с параметром и она сама отфильтрует по имени процесса, выйдет покороче, но процессов может быть два, "TOTALCMD.EXE" и "TOTALCMD64.EXE", поэтому только перебор всех.
Есть ещё вариант получить список всех окон, отфильтрованный по "TTOTAL_CMD", но некоторые инструменты можно запускать отдельным процессом...
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Время от времени стали возникать непонятные проблемы (может они и раньше возникали, просто Тоталом менее активно пользовался).

В autorun.cfg прописаны переменные окружения. Например,
SetEnv /A /EV PATH ;%commander_path%\System
SetEnv /EV TCFS %commander_path%\Plugins\exe\TCFS2\TCFS2.exe
и прочие.

Иногда Тотал теряет их. И при попытке выполнить команду, содержащую такую переменную, выдаёт ошибку, что "такого файла не существует".
Нечасто, может раз-два в неделю. Не могу понять причину и закономерности, почему так происходит. После перезапуска Тотала всё снова работает.
Может кто сталкивается?
Или плагин Autorun выгружается? (по какой причине это может происходить? командой выгрузки плагинов не пользуюсь). Или работа назначенных при запуске переменных не зависит от него?
Windows 11 | TC DreamLair eternal pre-α
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

LonerD писал(а):Или плагин Autorun выгружается? (по какой причине это может происходить? командой выгрузки плагинов не пользуюсь). Или работа назначенных при запуске переменных не зависит от него?
Да, переменные окружения после создания не зависят от состояния запуска Autorun.

Больше добавить ничего не могу, не сталкивался с таким. Если при возникновении проблемы посмотреть переменные плагином EnvVariables, их содержимое выглядит нормально?
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Loopback писал(а):Если при возникновении проблемы посмотреть переменные плагином EnvVariables, их содержимое выглядит нормально?
Я несколько раз быстренько перезапускал Тотал, а потом только вспоминал, что забыл посмотреть список переменных. :roll:
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Опять отвалились переменные на ровном месте.

В плагине Autorun прописано так:

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

SetEnv /A /EV PATH ;%commander_path%
SetEnv /A /EV PATH ;%commander_path%\System
В %commander_path%\System лежит файл Hidcon.exe для скрытия консольных окон. И есть несколько пользовательских команд, начинающихся с конструкции:
cmd=Hidcon.exe %comspec% /c

Запускаю последовательно несколько команд, потом оп - через пару секунд следующая уже не запускается. Посмотрел плагином EnvVariables - добавленные значения в переменной PATH пропали. Перезапустил Тотал, попробовал снова, воспроизвести пропадание не удалось.

Заметил ошибки в моей записи.
1. Для чего у меня было /EV - не знаю.
2. Точку с запятой правильнее ставить в конце пути, иначе в тексте переменной получится ;;
Правильно будет вот так:

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

SetEnv /A PATH %commander_path%;
SetEnv /A PATH %commander_path%\System;
-----------------------
Но выявил и другую проблему, которая касается непосредственно плагина.
Время от времени перезапускаю Тотал. Не закрываю, а перезапускаю утилитой Tinny TC Restarter. Оказывается, в конце переменной PATH накапливаются записи вида

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

;D:\TCDL;D:\TCDL\System;D:\TCDL;D:\TCDL\System;D:\TCDL;D:\TCDL\System;D:\TCDL;D:\TCDL\System;
Может, Windows время от времени запускает внутреннюю проверку состояния системы, обнаруживает это непотребство и удаляет подозрительные записи.

По справке:
При использовании опции /A плагин проверяет наличие добавляемого текста в конце значения переменной и не добавляет его повторно.
На деле это почему-то не работает.

Windows 11 x64, TC 11 RC3, Autorun 2.2.10 beta.
Попробовал более ранние версии Autorun - поведение то же самое.
Windows 11 | TC DreamLair eternal pre-α
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

LonerD писал(а):Запускаю последовательно несколько команд, потом оп - через пару секунд следующая уже не запускается. Посмотрел плагином EnvVariables - добавленные значения в переменной PATH пропали. Перезапустил Тотал, попробовал снова, воспроизвести пропадание не удалось.
Интересно, получается, что пропадают добавленные записи в PATH. В принципе, PATH достаточно критичная переменная, может это работа антивируса какого?
LonerD писал(а):1. Для чего у меня было /EV - не знаю.
Переключатель /EV остался от совсем ранних времён, когда он включал разворачивание переменных. Сейчас он ничего не делает, т.к. разворачивание включено по умолчанию, а отключается с помощью /EV-.
LonerD писал(а):2. Точку с запятой правильнее ставить в конце пути, иначе в тексте переменной получится ;;
А это зависит от конкретной системы, что туда записано. У меня в конце PATH нет точки с запятой. В принципе, в случае сомнений правильнее проверять наличие ; в конце исходной переменной перед дозаписью.
LonerD писал(а): Оказывается, в конце переменной PATH накапливаются записи вида
В принципе, тут всё согласно документации - проверяется текст в конце, а тут для каждой команды предыдущий текст будет другой. Т.е. чтобы всё сработало, надо устанавливать весь текст одной командой:

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

SetEnv /A PATH %commander_path%;%commander_path%\System;
Возможно, стоит добавить уточнение в справку.
LonerD писал(а):Может, Windows время от времени запускает внутреннюю проверку состояния системы, обнаруживает это непотребство и удаляет подозрительные записи.
Содержимое переменной PATH, с которой оперирует процесс тотала - унаследованное, т.е. изменение системного PATH после запуска TC уже не повлияет на PATH процесса тотала. Ну вроде так всегда раньше было, может что-то в 11 поменялось...
Аватара пользователя
LonerD
Сообщения: 1174
Зарегистрирован: Вт янв 04, 2011 03:56
Откуда: Макеевка
Контактная информация:

Сообщение LonerD »

Loopback писал(а):Т.е. чтобы всё сработало, надо устанавливать весь текст одной командой:

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

SetEnv /A PATH %commander_path%;%commander_path%\System;
Теперь всё отлично, лишние записи не появляются.
Windows 11 | TC DreamLair eternal pre-α
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Вот такой вариант окошка копирования F5/F6 в TC 11.00 на Win 10:
Изображение

[cut="И его код:"]

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

LoadLibrary 'Plugins\Autorun_ModifyDialogs.dll'
IniRead CRNTLNG  %COMMANDER_INI% "Configuration" "LanguageIni"
IniRead AUTOSIZE %COMMANDER_INI% "Configuration" "AutoSizeDialogs" 1

# cm_Copy, cm_RenMove F5/F6
If %AUTORUN_TCARCH% = 32 Then
  If %AUTOSIZE% = 1 Then
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:8  /W:-7  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:67 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-223        "TButton" 4 "" #Tree
      AddControl /X:-20  /W:-18 "TButton" 1 "" #F2
      AddControl /X:-167 /W:-78 "TButton" 2 "⌵" #Options
      AddControl /X:329  /W:-18 "TButton" 5 "" #OK
      AddControl /X:106  /W:2   "TButton" 3 "" #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:8  /W:-7  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:67 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-223        "TButton" 4 "" #Tree
      AddControl /X:-20  /W:-18 "TButton" 1 "" #F2
      AddControl /X:329  /W:-18 "TButton" 5 "" #OK
      AddControl /X:106  /W:2   "TButton" 3 "" #Cancel
  Else # %AUTOSIZE% = 0
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-4  /W:5  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:64 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-225        "TButton" 4 "" #Tree
      AddControl /X:-19  /W:-18 "TButton" 1 "" #F2
      AddControl /X:-169 /W:-78 "TButton" 2 "⌵" #Options
      AddControl /X:330  /W:-18 "TButton" 5 "" #OK
      AddControl /X:106  /W:2   "TButton" 3 "" #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-4  /W:5  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:64 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-225        "TButton" 4 "" #Tree
      AddControl /X:-19  /W:-18 "TButton" 1 "" #F2
      AddControl /X:330  /W:-18 "TButton" 5 "" #OK
      AddControl /X:106  /W:2   "TButton" 3 "" #Cancel
  EndIf
Else # %AUTORUN_TCARCH% = 64
  If %AUTOSIZE% = 1 Then
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "Button" 5  "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:10  /W:-10  "Button" 3 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:68 /W:-65 "Button" 3  "" #MD5
      EndIf
      AddControl /X:-223        "Button" 7  "" #Tree
      AddControl /X:-20  /W:-18 "Button" 1  "" #F2
      AddControl /X:-167 /W:-78 "Button" 2  "⌵" #Options
      AddControl /X:329  /W:-18 "Button" 8  "" #OK
      AddControl /X:106  /W:2   "Button" 6  "" #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "Button" 10 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:10  /W:-10 "Button" 8 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:68 /W:-65 "Button" 8  "" #MD5
      EndIf
      AddControl /X:-223        "Button" 12 "" #Tree
      AddControl /X:-20  /W:-18 "Button" 6  "" #F2
      AddControl /X:329  /W:-18 "Button" 13 "" #OK
      AddControl /X:106  /W:2   "Button" 11 "" #Cancel
  Else # %AUTOSIZE% = 0
    AddDialog DIALOG_COPYMOVE
      AddControl                "Button" 0  ""
      AddControl /W:-20         "Button" 4  "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-5  /W:5  "Button" 1  "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:65 /W:-65 "Button" 1  "" #MD5
      EndIf
      AddControl /X:-225        "Button" 6  "" #Tree
      AddControl /X:-20  /W:-18 "Button" 2  "" #F2
      AddControl /X:-167 /W:-78 "Button" 3  "⌵" #Options
      AddControl /X:331  /W:-18 "Button" 7  "" #OK
      AddControl /X:107  /W:2   "Button" 5  "" #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl                "Button" 0  ""
      AddControl /W:-20         "Button" 9  "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-5  /W:5  "Button" 1  "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:65 /W:-65 "Button" 1  "" #MD5
      EndIf
      AddControl /X:-225        "Button" 11 "" #Tree
      AddControl /X:-20  /W:-18 "Button" 7  "" #F2
      AddControl /X:331  /W:-18 "Button" 12 "" #OK
      AddControl /X:107  /W:2   "Button" 10 "" #Cancel
  EndIf
EndIf

ModifyDialogs
[/cut]
Это при шрифте для диалогов Segoe UI, 9.
Loopback
В коде, в 64-битной части есть пара строк:

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

AddControl                "Button" 0  ""
Без них отказывались работать строки с Button 1, вот такие:

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

AddControl /X:-5  /W:5  "Button" 1  "" #MD5
Точнее, вначале когда я написал строку с Button 1, она не работала. Потом стал экспериментировать, проверять где какие instance, и при добавлении Button 0 вдруг заработала Button 1. Потом, после того, как весь код был готов, Button 1 вроде заработала и без Button 0. Но я уж не стал ничего трогать, оставил нули на всякий пожарный. Как думаете, почему такое поведение? Я сам ума не приложу.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

yozhik
Трудно сказать. Нулевой экземпляр не имеет смысла, т.к. нумерация начинается с 1, для него никогда не будет найден хэндл контрола и следовательно, не будет производиться никаких действий. А вот почему сначала не работало - в прошлом году мы уже сталкивались с каким-то странным несовпадением экземпляров в x64, возможно это что-то из той же оперы.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Сегодня повторилось с двумя другими диалогами. В одном код «промахивался» мимо экземпляров, пока не подставил вызов нулевого — сразу заработало. А во втором случае уже в настроенном (вчера) диалоге перестал отображаться назначенный кнопке текст (я вместо «Справка» назначил «?»). Вписал в код вызов нулевого — всё встало на места.

Скажите, пожалуйста, а не трудоёмко ли будет добавить в AddControl возможность вместо текста назначать иконку? Например, как-то так:

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

AddControl /W:-40 "TButton" 3 %ICON%,8
В переменной адрес к *.dll, и после запятой номер иконки в наборе. Я сегодня дооолго искал хоть какой подходящий символ для кнопки «Дерево». Не нашёл, нету. А так бы что-нибудь такое поставил Изображение, очень было бы удобно.
Loopback
Сообщения: 1646
Зарегистрирован: Пн сен 07, 2009 09:29

Сообщение Loopback »

yozhik писал(а):Вписал в код вызов нулевого — всё встало на места.
Я так понимаю, это только в x64? Такое впечатление, что что-то не инициализируется без предварительного холостого прогона, но что именно, неясно. Посмотрел наиболее очевидные места, проблем не увидел. Хорошо бы, конечно, выделить минимальный код, при котором проблема повторяется...
yozhik писал(а):а не трудоёмко ли будет добавить в AddControl возможность вместо текста назначать иконку?
Без сложностей иконку можно поставить только на стандартные кнопки и static-контролы. Наследники static в формах TC не используются, остаются только кнопки. В их основе стандартный button, но это же delphi/lazarus, как они себя поведут, без тестов непонятно. Если нормально, то должно быть не слишком сложно.
Аватара пользователя
yozhik
Сообщения: 353
Зарегистрирован: Вс май 04, 2014 20:34
Откуда: Электросталь

Сообщение yozhik »

Loopback писал(а):Я так понимаю, это только в x64?
Нет-с. И в 32-битном тоже.
Loopback писал(а):выделить минимальный код, при котором проблема повторяется...
Вот к счастью у меня сразу воспроизвелось. Уточним: Тотал 11.00 32/64, Windows 10 21H2 64bit. Запускаю 32-битный TC:
Изображение Изображение
Я прошу прощения, [s]давайте я вам откопирую всё, что для ModifyDialogs наваял[/s] (в следующем посте сообразил и сделал краткий код как вы просили). Я себе плохо представляю механизмы всей этой кухни, а вдруг там что-то ещё влияет. Но у меня всё прокомментировано, так что вам будет удобно найти нужный отрывок. Сейчас у меня все нулевые вызовы закомментированы. При первом же запуске артефакт проявляется в 2х диалогах: распаковки и атрибутов (на скринах). После раскомментирования нулевых начинает отображаться «?», как и задумано.
[cut="Изменённые диалоги"]

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

# ПЛАГИНЫ: ЗАГРУЗКА ......................................................... #
LoadLibrary 'Plugins\Autorun_ModifyDialogs.dll'

# ПЛАГИНЫ: переменные для имён элементов .................................... #
IniRead CRNTLNG  %COMMANDER_INI% "Configuration" "LanguageIni"
If %CRNTLNG% = '' Then
  Set TREEBTN "&Tree"
Else
  LngRead TREEBTN 5002 "%COMMANDER_PATH%\LANGUAGE\%CRNTLNG%"
EndIf
IniRead AUTOSIZE %COMMANDER_INI% "Configuration" "AutoSizeDialogs" 1
IniRead FONTNAME %COMMANDER_INI% "AllResolutions" "FontNameDialog"
IniRead FONTSIZE %COMMANDER_INI% "AllResolutions" "FontSizeDialog"

# ПЛАГИНЫ: MODIFY_DIALOGS ................................................... #
# Диалог cm_CopySamePanel Shift+F5/F6
# AUTOSIZE, FONTNAME, FONTSIZE здесь не влияют
If %AUTORUN_TCARCH% = 32 Then
  AddDialog    /W:105 /CENTER:1 "TCheckComboBox"
  AddControl   /W:109       "TMyComboBox" 1
  AddControl           /Y:4 "TMyCheckBox" 2 "" #NTFS
  AddControl           /Y:2 "TMyCheckBox" 1 "" #MD5
  AddCondition /TEXT            "TButton" 1 %TREEBTN%
  AddControl   /X:-222          "TButton" 1 "" #Tree
  AddControl   /X:257           "TButton" 3 "" #OK
  AddControl   /X:106           "TButton" 2 "" #Cancel
Else
  AddDialog    /W:105 /CENTER:1 "TCheckComboBox"
  AddControl   /W:109      "LCLComboBox" 1 "" # м.б. когда-то заработает :(
  AddCondition /TEXT            "Button" 3 %TREEBTN%
  AddControl           /Y:6     "Button" 6 "" #NTFS
  AddControl           /Y:4     "Button" 2 "" #MD5
  AddControl   /X:-224 /Y:-8    "Button" 3 "" #Tree
  AddControl   /X:253  /Y:-8    "Button" 5 "" #OK
  AddControl   /X:102  /Y:-8    "Button" 4 "" #Cancel
EndIf

# Диалог создания файла cm_EditNewFile Shift+F4
# кнопку Дерево переносим на левый край, кнопки OK и Cancel справа вместе
# AUTOSIZE, FONTNAME, FONTSIZE здесь не влияют
If %AUTORUN_TCARCH% = 32 Then
  AddDialog    "TCOMBOINPUT"
  AddCondition /TEXT          "TButton" 1 %TREEBTN%
  AddControl   /X:-149 /W:-28 "TButton" 1 "" #Tree
  AddControl   /X:-2          "TButton" 2 "" #Cancel
  AddControl   /X:2           "TButton" 3 "" #OK
Else
  AddDialog    "TCOMBOINPUT"
  AddCondition /TEXT           "Button" 1 %TREEBTN%
  AddControl   /X:-149 /W:-28  "Button" 1 "" #Tree
  AddControl   /X:-2           "Button" 2 "" #Cancel
  AddControl   /X:2            "Button" 3 "" #OK
Endif

# Диалог атрибутов cm_SetAttrib
If %AUTORUN_TCARCH% = 32 Then
  If %AUTOSIZE% = 1 Then
    AddDialog "TATTRIBDLG"
    # AddControl                "TButton" 0
    AddControl /X:-330 /W:-80 "TButton" 7 "?" #Help
    AddControl /X:208         "TButton" 9 ""  #OK
    AddControl /X:204         "TButton" 8 ""  #Cancel
  Else
    AddDialog "TATTRIBDLG"
    # AddControl                "TButton" 0
    AddControl /X:-331 /W:-80 "TButton" 7 "?" #Help
    AddControl /X:207         "TButton" 9 ""  #OK
    AddControl /X:203         "TButton" 8 ""  #Cancel
  Endif
Else
  If %AUTOSIZE% = 1 Then
    AddDialog "TATTRIBDLG"
    # AddControl                "Button" 0
    AddControl /X:-329 /W:-80 "Button" 11 "?" #Help
    AddControl /X:207         "Button" 13 ""  #OK
    AddControl /X:203         "Button" 12 ""  #Cancel
  Else
    AddDialog "TATTRIBDLG"
    # AddControl                "Button" 0
    AddControl /X:-330 /W:-80 "Button" 11 "?" #Help
    AddControl /X:206         "Button" 13 ""  #OK
    AddControl /X:202         "Button" 12 ""  #Cancel
  Endif
Endif

# Диалог упаковки cm_PackFiles Alt+F5
If %AUTORUN_TCARCH% = 32 Then
  If %AUTOSIZE% = 1 Then
    AddDialog  /H:13 "TDLGZIP"
    # AddControl                      "TButton" 0
    AddControl /X:-236 /Y:12        "TButton" 4 ""  #Tree
    AddControl /X:167  /Y:12        "TButton" 5 ""  #OK
    AddControl /X:70   /Y:12        "TButton" 3 ""  #Cancel
    AddControl /X:70   /Y:12 /W:-70 "TButton" 1 "?" #Help
  Else
    AddDialog  /H:14 "TDLGZIP"
    # AddControl                      "TButton" 0
    AddControl /X:-236 /Y:14        "TButton" 4 ""  #Tree
    AddControl /X:167  /Y:14        "TButton" 5 ""  #OK
    AddControl /X:70   /Y:14        "TButton" 3 ""  #Cancel
    AddControl /X:70   /Y:14 /W:-70 "TButton" 1 "?" #Help
  EndIf
Else
  If %AUTOSIZE% = 1 Then
    AddDialog  /H:13 "TDLGZIP"
    # AddControl                      "Button" 0
    AddControl /X:-230 /Y:12        "Button" 21 ""  #Tree
    AddControl /X:170  /Y:12        "Button" 22 ""  #OK
    AddControl /X:75   /Y:12        "Button" 20 ""  #Cancel
    AddControl /X:75   /Y:12 /W:-69 "Button" 5  "?" #Help
  Else
    AddDialog  /H:14 "TDLGZIP"
    # AddControl                      "Button" 0
    AddControl /X:-232 /Y:14        "Button" 21 ""  #Tree
    AddControl /X:170  /Y:14        "Button" 22 ""  #OK
    AddControl /X:75   /Y:14        "Button" 20 ""  #Cancel
    AddControl /X:75   /Y:14 /W:-68 "Button" 5  "?" #Help
  Endif
Endif

# Диалог распаковки cm_UnpackFiles Alt+F9/Alt+F6
If %AUTORUN_TCARCH% = 32 Then
  AddDialog    "TDLGUNZIPALL"
  # AddControl                  "TButton" 0
  AddControl         /W:2 "TMyComboBox" 1 ""  #Auto-detect
  AddControl   /X:80 /W:-80   "TButton" 1 "?" #Help
  If %AUTOSIZE% = 1 Then
    AddControl /X:-166        "TButton" 3 ""  #Tree
    AddControl /X:202         "TButton" 4 ""  #OK
    AddControl /X:82          "TButton" 2 ""  #Cancel
  Else
    AddControl /X:-167        "TButton" 3 ""  #Tree
    AddControl /X:205         "TButton" 4 ""  #OK
    AddControl /X:84          "TButton" 2 ""  #Cancel
  Endif
Else # %AUTORUN_TCARCH% = 64
    AddDialog  "TDLGUNZIPALL"
    # AddControl                "Button" 0
    AddControl /X:-165        "Button" 4 ""  #Tree
    AddControl /X:201         "Button" 5 ""  #OK
    AddControl /X:82          "Button" 3 ""  #Cancel
    AddControl /X:80 /W:-80   "Button" 2 "?" #Help
Endif

# Диалог копирования/перемещения cm_Copy/cm_RenMove F5/F6
# кнопки слева-направо: Дерево, В очередь, Доп. (со стрелочкой), OK, Отмена
# FONTNAME, FONTSIZE не стал пока указывать
If %AUTORUN_TCARCH% = 32 Then
  If %AUTOSIZE% = 1 Then
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:8  /W:-7  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:67 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-223        "TButton" 4 ""  #Tree
      AddControl /X:-20  /W:-18 "TButton" 1 ""  #F2
      AddControl /X:-164 /W:-86 "TButton" 2 "⌵" #Options
      AddControl /X:329  /W:-18 "TButton" 5 ""  #OK
      AddControl /X:106  /W:2   "TButton" 3 ""  #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:8  /W:-7  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:67 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-223        "TButton" 4 ""  #Tree
      AddControl /X:-20  /W:-18 "TButton" 1 ""  #F2
      AddControl /X:329  /W:-18 "TButton" 5 ""  #OK
      AddControl /X:106  /W:2   "TButton" 3 ""  #Cancel
  Else # %AUTOSIZE% = 0
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-4  /W:5  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:64 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-225        "TButton" 4 ""  #Tree
      AddControl /X:-19  /W:-18 "TButton" 1 ""  #F2
      AddControl /X:-165 /W:-86 "TButton" 2 "⌵" #Options
      AddControl /X:330  /W:-18 "TButton" 5 ""  #OK
      AddControl /X:106  /W:2   "TButton" 3 ""  #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "TMyCheckBox" 3 "" #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-4  /W:5  "TMyCheckBox" 1 "" #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:64 /W:-68 "TMyCheckBox" 1 "" #MD5
      EndIf
      AddControl /X:-225        "TButton" 4 ""  #Tree
      AddControl /X:-19  /W:-18 "TButton" 1 ""  #F2
      AddControl /X:330  /W:-18 "TButton" 5 ""  #OK
      AddControl /X:106  /W:2   "TButton" 3 ""  #Cancel
  EndIf
Else # %AUTORUN_TCARCH% = 64
  If %AUTOSIZE% = 1 Then
    AddDialog DIALOG_COPYMOVE
      AddControl /W:-20         "Button" 5  ""  #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:10  /W:-10 "Button" 3 ""  #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:68 /W:-65 "Button" 3  ""  #MD5
      EndIf
      AddControl /X:-223        "Button" 7  ""  #Tree
      AddControl /X:-20  /W:-18 "Button" 1  ""  #F2
      AddControl /X:-163 /W:-85 "Button" 2  "⌵" #Options
      AddControl /X:329  /W:-18 "Button" 8  ""  #OK
      AddControl /X:106  /W:2   "Button" 6  ""  #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl /W:-20         "Button" 10 ""  #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:10  /W:-10 "Button" 8 ""  #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:68 /W:-65 "Button" 8  ""  #MD5
      EndIf
      AddControl /X:-223        "Button" 12 ""  #Tree
      AddControl /X:-20  /W:-18 "Button" 6  ""  #F2
      AddControl /X:329  /W:-18 "Button" 13 ""  #OK
      AddControl /X:106  /W:2   "Button" 11 ""  #Cancel
  Else # %AUTOSIZE% = 0
    AddDialog DIALOG_COPYMOVE
      AddControl                "Button" 0  ""
      AddControl /W:-20         "Button" 4  ""  #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-5  /W:5  "Button" 1  ""  #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:65 /W:-65 "Button" 1  ""  #MD5
      EndIf
      AddControl /X:-225        "Button" 6  ""  #Tree
      AddControl /X:-20  /W:-18 "Button" 2  ""  #F2
      AddControl /X:-164 /W:-85 "Button" 3  "⌵" #Options
      AddControl /X:331  /W:-18 "Button" 7  ""  #OK
      AddControl /X:107  /W:2   "Button" 5  ""  #Cancel
    AddDialog DIALOG_COPYMOVE_PINNED
      AddControl                "Button" 0  ""
      AddControl /W:-20         "Button" 9  ""  #NTFS
      If StrPos(%CRNTLNG%, "RUS") > 0 Then
        AddControl /X:-5  /W:5  "Button" 1  ""  #MD5
      ElseIf StrPos(%CRNTLNG%, "ENG") > 0 Then
        AddControl /X:65 /W:-65 "Button" 1  ""  #MD5
      EndIf
      AddControl /X:-225        "Button" 11 ""  #Tree
      AddControl /X:-20  /W:-18 "Button" 7  ""  #F2
      AddControl /X:331  /W:-18 "Button" 12 ""  #OK
      AddControl /X:107  /W:2   "Button" 10 ""  #Cancel
  EndIf
EndIf

ModifyDialogs
[/cut]
Loopback писал(а):Без сложностей иконку можно поставить только на стандартные кнопки и static-контролы.
Ну, и прекрасно, хватит за глаза. Давайте, пожалуйста, попробуем. Если получится, то я бы все «Справки» и «Деревья» под аккуратные контурные иконки «спрятал» :roll:, гораздо бы эргономичней вышло. Можно пока начать только с кнопок — на них иконки точно нужны. А вот пригодится ли это для static-контролов я пока не приглядывался.
Последний раз редактировалось yozhik Чт авг 10, 2023 19:13, всего редактировалось 1 раз.
Аватара пользователя
lz57005
Сообщения: 28
Зарегистрирован: Чт мар 05, 2020 09:47
Контактная информация:

Сообщение lz57005 »

LonerD писал(а):Другими словами немного подробней.
Есть мой Тотал, настроенный. В Autorun прописан запуск программы, она запускается и работает в фоне. Я могу запускать несколько копий моего Тотала и закрывать их. Всё это время программа должна быть запущена. Когда я закрою последнюю копию моего Тотала - программа должна выгрузиться.
В то же время параллельно я могу запускать чистый Тотал или чужие сборки. Они никак не должны влиять на запуск и закрытие программы.
Очевидное решение использовать как признак запуска программы наличие/отсутствие PID c нужным ImagePath, а не именем процесса, а при закрытии проверять аналогично процессы с путём %commander_exe% и закрывать программу тоже не по имени, вот пример:

MultiTCruncloseExample.7z

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

autorun.cfg
...
ShellExec /SW_HIDE "%COMMANDER_PATH%\utils\StartDummy.bat"
...
Pragma AutorunFinalizeSection
...
ShellExec /SW_HIDE "%COMMANDER_PATH%\utils\StopDummy.bat"
cmd, nircmd, pathpid (самописная утилита которая выдаёт в stdout/stderr pid первого процесса с путём из параметра запуска)

Dummy.exe запустится только с первым экземпляром тотала и закроется с последним, имея ввиду только тоталы и запускаемую программу расположенные в конкретных папках, игнорируя иные экземпляры запущенные из других мест
Ответить