Страница 203 из 243

Добавлено: Сб сен 13, 2025 00:26
A55555
Orion9 писал(а):
A55555 писал(а):Я скопировал те строки из мониторинга выключения, по логике, в TorrentSize, но оно не заработало, подсазка возле курсора осталась по умолчанию крошечной.
Вы правильно сделали, но в теле функции подсказка вызывается два раза, если не считать подсказки об ошибках (Файл не существует, Каталог и т.д.). Возможно, вы вставили строки перед одной подсказкой, но вызывалась другая. Первая подсказка вызывается для одиночных файлов, вторая - для выделенных. По сути, нужно и перед той, и перед другой сделать. Но не забудьте после каждого ShowHint() добавить строку сброса параметров SetHintParam("ShowHint", "Reload"), поскольку изменение параметров происходить глобально и затрагивает все подсказки в плагине.
Спасибо, подсказки в TorrentSize и Duration настроил.
Orion9 писал(а):Что же касается монитора выключения, то вот какие идеи у меня были на этот счет. Скорее всего помешать процессу копирования смогут только два диалога - ExtMsgForm и TOverWriteForm. Это две формы, которые объединяют в себе все, что вы перечислили выше. Можно было бы просто искать эти окна и следить за ними, но мне не понравился этот подход. Кроме того нужно учитывать, что окна могут быть открыты в других процессах ТС, поэтому нужно что-то более универсальное. Если допустить, что перекрывающее окно диалога будет иметь владельцем окно копирования (а судя по всему так оно и есть), то достаточно просто проверять окна первого уровня на наличие такого владельца. Пример такого перечисления окон первого уровня есть в справке к объекту Callback, его я и взял. Остальное, как говорится, дело техники. Полный код всего:
Находясь в TC в момент, когда после окончания копирования появляется окно счетчика, поверх всех окон не срабатывает для окна счетчика.

При этом, если находиться в момент появления окна счетчика в другом окне, например браузере, то поверх всех окон для этого окна счетчика срабатывает.

Добавлено спустя 32 минуты:
Orion9 писал(а):A55555
А что касается подсказки MediaInfo на панелях (если вы её имеете в виду), то ее нужно собирать из нескольких частей. Помимо кода Autorun, должны быть созданы 60 полей, т.е. в секции [HintsCustomField] должны быть два щаблона *.* по 30 полей каждый, которые должны ее замыкать. Т.е. цифры у 22exts и 22fields должны быть своими, как и у 23exts и 23fields.

Можно просто войти в Настройки -> Содержимое панелей -> Пользовательские и добавить там два шаблона *.*

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

[=autorun.C1]\n[=autorun.C2]\n[=autorun.C3]\n[=autorun.C4]\n[=autorun.C5]\n[=autorun.C6]\n[=autorun.C7]\n[=autorun.C8]\n[=autorun.C9]\n[=autorun.C10]\n[=autorun.C11]\n[=autorun.C12]\n[=autorun.C13]\n[=autorun.C14]\n[=autorun.C15]\n[=autorun.C16]\n[=autorun.C17]\n[=autorun.C18]\n[=autorun.C19]\n[=autorun.C20]\n[=autorun.C21]\n[=autorun.C22]\n[=autorun.C23]\n[=autorun.C24]\n[=autorun.C25]\n[=autorun.C26]\n[=autorun.C27]\n[=autorun.C28]\n[=autorun.C29]\n[=autorun.C30]

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

[=autorun.C31]\n[=autorun.C32]\n[=autorun.C33]\n[=autorun.C34]\n[=autorun.C35]\n[=autorun.C36]\n[=autorun.C37]\n[=autorun.C38]\n[=autorun.C39]\n[=autorun.C40]\n[=autorun.C41]\n[=autorun.C42]\n[=autorun.C43]\n[=autorun.C44]\n[=autorun.C45]\n[=autorun.C46]\n[=autorun.C47]\n[=autorun.C48]\n[=autorun.C49]\n[=autorun.C50]\n[=autorun.C51]\n[=autorun.C52]\n[=autorun.C53]\n[=autorun.C54]\n[=autorun.C55]\n[=autorun.C56]\n[=autorun.C57]\n[=autorun.C58]\n[=autorun.C59]\n[=autorun.C60]
Там же нужно поставить галочку "Объединять все подсказки, подходящие по типу файлов".
При создании, эти шаблоны можно назвать как угодно или фиксированные имена какие-то дать необходимо?
Orion9 писал(а):После перезагрузки ТС у плагина Autorun должно появится 60 дополнительных полей. Проверить это можно в WDX Guide.
Для проверки, этой утилите необходимо указать на файл autorun.cfg?

Добавлено: Сб сен 13, 2025 10:34
AkulaBig
Orion9 писал(а):Вариантов, наверное, есть несколько, но если так?
Спасибо:

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

вроде работает!
Добавлено спустя 2 минуты:
A55555 писал(а):Для проверки, этой утилите необходимо указать на файл autorun.cfg?
Просто зайдите в пользовательские колонки и посмотрите, появились у autorun эти поля.

Добавлено: Сб сен 13, 2025 12:41
Orion9
Loopback писал(а):до сих пор такие вещи всплывают...
Сталкивался с чем-то подобным, но тогда не придал значения, поскольку, вероятно, удалось найти какой-то обходной путь, но это не отменяет того факта, что уже тысячи и тысячи строк были успешно написаны на Autorun и продолжают писаться. Вы сделали отличное ядро, практически полноценный скриптовый язык для работы с Total Commander, который по содержанию приближается к таким гигантам, как Autohotkey. А что, если отбросить GUI, COM и прочие плюшки, так оно и получается. Поэтому считаю, что в описании плагина должно быть указано, что это именно скриптовый язык для работы с ТС, не иначе! Autorun давно уже перерос свой статус обычного выполнения действий при запуске:
[cut]

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

Это псевдоконтентный плагин, предназначенный для выполнения некоторых задач при запуске Total Commander. Можно запустить файл, выполнить команду (cm_ и em_), установить переменную окружения, записать значение в ini-файл, задать задержку между выполнением команд, загрузить библиотеку или плагин. Команды читаются из текстового файла конфигурации. 
[/cut]
Loopback писал(а):На самом деле свет в конце туннеля виден.
Это радует. Ещё полгода назад всё не так было радужно )
A55555 писал(а):Находясь в TC в момент, когда после окончания копирования появляется окно счетчика, поверх всех окон не срабатывает для окна счетчика.
Не вижу у себя этой проблемы. Состояние окна счётчика "Поверх всех окон" устанавливается командой WinSetState(30, h_WinShutdown) после его создания. По идее не должно быть важно, где в этот момент находится пользователь, окно все-равно должно показываться поверх остальных. Кстати, я об этом упоминал, но вызвать только окно с отсчетом можно отдельной командой 80800:

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

TOTALCMD#BAR#DATA
808000

%COMMANDER_EXE%
808000


-1
Работает у вас так? Висит окно поверх всех?
A55555 писал(а):При создании, эти шаблоны можно назвать как угодно или фиксированные имена какие-то дать необходимо?
Имена шаблонам можно не давать, только маску нужно указать *.* Можно выбрать и другую маску, например *.mp3, но тогда подсказка будет срабатывать только на mp3-файлах.
A55555 писал(а):Для проверки, этой утилите необходимо указать на файл autorun.cfg?
Эта утилита показывает, какие поля есть у wdx-плагина. Их еще можно посмотреть из окна настройки пользовательских колонок, как написал AkulaBig. Autorun сам не создает пользовательские поля, пока не будет использована директива Pragma AutorunPluginFields. Почему полей так много? Потому что Гислер при отображении полей в подсказке игнорирует символы перевода строки, поэтому приходится разбивать текст, полученный от MediaInfo.dll, на отдельные строки и построчно выводить в свои поля. Т.о. 60 полей = 60 строк от MediaInfo. Видео файлы могут содержать гораздо больше строк, но на аудио файлы этого количества, как правило, хватает. Если бы не было этого ограничения от Гислера, то, конечно же, лучше было сделать одно поле, но такое количество мешает разве что визуально. Если нужно добавить к Autorun еще полей для других целей и задач, то никаких проблем не будет:

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

Pragma AutorunPluginFields "C1:::MagicHint" "C2:::MagicHint" "C3:::MagicHint" 
...
"C58:::MagicHint" "C59:::MagicHint" "C60:::MagicHint" "Frag:::FileVCN" "FragNum::ft_numeric_32:NumVCN" "FragEntry::ft_numeric_32:EntryVCN"
Добавятся еще три поля для отображения информации о фрагментах файла из недавнего примера.

Добавлено: Сб сен 13, 2025 22:33
A55555
Orion9 писал(а):Не вижу у себя этой проблемы. Состояние окна счётчика "Поверх всех окон" устанавливается командой WinSetState(30, h_WinShutdown) после его создания. По идее не должно быть важно, где в этот момент находится пользователь, окно все-равно должно показываться поверх остальных. Кстати, я об этом упоминал, но вызвать только окно с отсчетом можно отдельной командой 80800:

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

TOTALCMD#BAR#DATA
808000

%COMMANDER_EXE%
808000


-1
Работает у вас так? Висит окно поверх всех?
При нажатии этой кнопки у меня закрывается окно счетчика (как будто я нажал на крестик этого окна) и соответственно далее выскакивает сообщение "Выключение ПК отменено".
Я понял в чем проблема, не выходит на передний план окно счетчика, потому что у меня автостарт по F11 стоит для полноэкранного режима TC
[cut]

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

LoadLibrary Plugins\TCFS2Tools.dll
LoadLibrary Plugins\Autorun_Tweaks.dll
LoadLibrary Plugins\Autorun_Runtime.dll
LoadLibrary Plugins\Autorun_Sysinfo.dll

SetHotKeyAction /H:F11 ToggleFullScreen
 
WinGetPos('cX', 'cY', 'cW', 'cH')
If Not FileExist(AUTORUN_PATH & '\Layout.ini') Then
    ShellExec /SW_HIDE /WAIT %ComSpec% '/q/c echo [Layout]>%AUTORUN_PATH%\Layout.ini'
    Local sLayout = IniReadSection('~/R', COMMANDER_INI, 'Layout')
    If StrPos(sLayout, '=') Then _
    IniWriteSection(AUTORUN_PATH & '\Layout.ini', 'Layout', sLayout)
Else
    Local sLayout = IniReadSection(AUTORUN_PATH & '\Layout.ini', 'Layout')
    If StrPos(sLayout, '=') Then _
    IniWriteSection('~/R', COMMANDER_INI, 'Layout', sLayout)
EndIf

### переход в полноэкранный режим при старте. НАЧАЛО
ToggleFullScreen()
 
Func ToggleFullScreen(WinChange=1)
    Static HasTabHeader, HasStatusBar, HasDriveList, HasKeyButtons, HasCmdLine, _
           HasDriveBar, HasButtonBar, HasButtonBar2, HasMainHeader
		   
### переход в полноэкранный режим при старте КОНЕЦ (закомментировав не будет сразу в полноєкранном режиме)
   
    IniRead /R HasCurDir %COMMANDER_INI% 'Layout' 'CurDir'
    If HasCurDir Then SendMessage(AUTORUN_TCHANDLE, 11, 0)
    If WinChange Then
        # SPI_GETWORKAREA - desktop area without taskbar
        Static wAreaX1 = SystemParametersInfo(48, 1), _
               wAreaY1 = SystemParametersInfo(48, 2), _
               wAreaX2 = SystemParametersInfo(48, 3), _
               wAreaY2 = SystemParametersInfo(48, 4)
        If HasCurDir Then
            Static wX = wAreaX1 ? wAreaX1 + 1 : 0, _
                   wY = wAreaY1 ? wAreaY1 + 1 : 0, _
                   wW = wAreaX2 = SYSINFO_DESKTOPWIDTH  ? wAreaX2 - wAreaX1 - 1 : wAreaX2 - wAreaX1, _
                   wH = wAreaY2 = SYSINFO_DESKTOPHEIGHT ? wAreaY2 - wAreaY1 - 1 : wAreaY2 - wAreaY1
            If WinGetState(6) Then WinSetState(9)
            WinSetPos(wX, wY, wW, wH)
        Else
            If WinGetState(6) Then WinSetState(9)
            If cX <> '' Then WinSetPos(cX, cY, cW, cH)
        EndIf
    EndIf

    If HasCurDir Then
        HasMainHeader = WinHasStyle(12582912)
        PostMessage(AUTORUN_TCHANDLE, 1075, 65538)
        IniRead /R HasTabHeader %COMMANDER_INI% 'Layout' 'TabHeader' 1
        IniRead /R HasStatusBar %COMMANDER_INI% 'Layout' 'StatusBar' 1
        IniRead /R HasDriveList %COMMANDER_INI% 'Layout' 'DriveCombo' 1
        IniRead /R HasKeyButtons %COMMANDER_INI% 'Layout' 'KeyButtons' 1
        IniRead /R HasCmdLine %COMMANDER_INI% 'Layout' 'CmdLine' 1
        IniRead /R HasDriveBar %COMMANDER_INI% 'Layout' 'DriveBar1' 0
        IniRead /R HasButtonBar %COMMANDER_INI% 'Layout' 'ButtonBar' 1
        IniRead /R HasButtonBar2 %COMMANDER_INI% 'Layout' 'ButtonBarVertical' 1
        #SendCommand 2902 2
        SendCommand 2906 2
        SendCommand 2907 2
        SendCommand 2908 2
        SendCommand 2909 2
        SendCommand 2910 2
        SendCommand 2911 2
        SendCommand 2944 2
        SendCommand 2901 2
        WinSetStyle 12582912 4
    Else
        PostMessage(AUTORUN_TCHANDLE, 1075, 65537)
        If HasButtonBar  Then SendCommand 2901 1
        #If HasDriveBar   Then SendCommand 2902 1
        If HasDriveList  Then SendCommand 2906 1
        SendCommand 2907 1
        If HasTabHeader  Then SendCommand 2908 1
        If HasStatusBar  Then SendCommand 2909 1
        If HasCmdLine    Then SendCommand 2910 1
        If HasKeyButtons Then SendCommand 2911 1
        If HasButtonBar2 Then SendCommand 2944 1
        If HasMainHeader Then WinSetStyle 12582912 2
    EndIf
    SendCommand 2918
    If HasCurDir Then SendMessage(AUTORUN_TCHANDLE, 11, 1)
    WinRedRaw 2
EndFunc
[/cut]
не получается у окна счетчика поверх вот этого полноэкранного режима выйти.
Поверх нормального окна TC всё нормально, выходит на передний план окно счетчика.

Orion9
всё стесняюсь спросить. Мониторинг выключения. Окно прогресса.
Меняю со 100 секунд на 50 например в нужных местах, работает.
Но с полосой прогресса (зеленая полоса в окне счетчика) ничего сделать не получается, она под 100 секунд заточена, т.е. при установленных мной 50 секунд, эта полоса только до половины доходит.
Если это целое дело, то не нужно, это уже такое.

Loopback
подскажите пожалуйста, можно в этом коде поправить, чтоб при выходе по F11 из поноэкранного режима окно было развернуло на весь экран.
[cut]

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

LoadLibrary Plugins\TCFS2Tools.dll
LoadLibrary Plugins\Autorun_Tweaks.dll
LoadLibrary Plugins\Autorun_Runtime.dll
LoadLibrary Plugins\Autorun_Sysinfo.dll

SetHotKeyAction /H:F11 ToggleFullScreen
 
WinGetPos('cX', 'cY', 'cW', 'cH')
If Not FileExist(AUTORUN_PATH & '\Layout.ini') Then
    ShellExec /SW_HIDE /WAIT %ComSpec% '/q/c echo [Layout]>%AUTORUN_PATH%\Layout.ini'
    Local sLayout = IniReadSection('~/R', COMMANDER_INI, 'Layout')
    If StrPos(sLayout, '=') Then _
    IniWriteSection(AUTORUN_PATH & '\Layout.ini', 'Layout', sLayout)
Else
    Local sLayout = IniReadSection(AUTORUN_PATH & '\Layout.ini', 'Layout')
    If StrPos(sLayout, '=') Then _
    IniWriteSection('~/R', COMMANDER_INI, 'Layout', sLayout)
EndIf

### переход в полноэкранный режим при старте. НАЧАЛО
ToggleFullScreen()
 
Func ToggleFullScreen(WinChange=1)
    Static HasTabHeader, HasStatusBar, HasDriveList, HasKeyButtons, HasCmdLine, _
           HasDriveBar, HasButtonBar, HasButtonBar2, HasMainHeader
		   
### переход в полноэкранный режим при старте КОНЕЦ (закомментировав не будет сразу в полноєкранном режиме)
   
    IniRead /R HasCurDir %COMMANDER_INI% 'Layout' 'CurDir'
    If HasCurDir Then SendMessage(AUTORUN_TCHANDLE, 11, 0)
    If WinChange Then
        # SPI_GETWORKAREA - desktop area without taskbar
        Static wAreaX1 = SystemParametersInfo(48, 1), _
               wAreaY1 = SystemParametersInfo(48, 2), _
               wAreaX2 = SystemParametersInfo(48, 3), _
               wAreaY2 = SystemParametersInfo(48, 4)
        If HasCurDir Then
            Static wX = wAreaX1 ? wAreaX1 + 1 : 0, _
                   wY = wAreaY1 ? wAreaY1 + 1 : 0, _
                   wW = wAreaX2 = SYSINFO_DESKTOPWIDTH  ? wAreaX2 - wAreaX1 - 1 : wAreaX2 - wAreaX1, _
                   wH = wAreaY2 = SYSINFO_DESKTOPHEIGHT ? wAreaY2 - wAreaY1 - 1 : wAreaY2 - wAreaY1
            If WinGetState(6) Then WinSetState(9)
            WinSetPos(wX, wY, wW, wH)
        Else
            If WinGetState(6) Then WinSetState(9)
            If cX <> '' Then WinSetPos(cX, cY, cW, cH)
        EndIf
    EndIf

    If HasCurDir Then
        HasMainHeader = WinHasStyle(12582912)
        PostMessage(AUTORUN_TCHANDLE, 1075, 65538)
        IniRead /R HasTabHeader %COMMANDER_INI% 'Layout' 'TabHeader' 1
        IniRead /R HasStatusBar %COMMANDER_INI% 'Layout' 'StatusBar' 1
        IniRead /R HasDriveList %COMMANDER_INI% 'Layout' 'DriveCombo' 1
        IniRead /R HasKeyButtons %COMMANDER_INI% 'Layout' 'KeyButtons' 1
        IniRead /R HasCmdLine %COMMANDER_INI% 'Layout' 'CmdLine' 1
        IniRead /R HasDriveBar %COMMANDER_INI% 'Layout' 'DriveBar1' 0
        IniRead /R HasButtonBar %COMMANDER_INI% 'Layout' 'ButtonBar' 1
        IniRead /R HasButtonBar2 %COMMANDER_INI% 'Layout' 'ButtonBarVertical' 1
        #SendCommand 2902 2
        SendCommand 2906 2
        SendCommand 2907 2
        SendCommand 2908 2
        SendCommand 2909 2
        SendCommand 2910 2
        SendCommand 2911 2
        SendCommand 2944 2
        SendCommand 2901 2
        WinSetStyle 12582912 4
    Else
        PostMessage(AUTORUN_TCHANDLE, 1075, 65537)
        If HasButtonBar  Then SendCommand 2901 1
        #If HasDriveBar   Then SendCommand 2902 1
        If HasDriveList  Then SendCommand 2906 1
        SendCommand 2907 1
        If HasTabHeader  Then SendCommand 2908 1
        If HasStatusBar  Then SendCommand 2909 1
        If HasCmdLine    Then SendCommand 2910 1
        If HasKeyButtons Then SendCommand 2911 1
        If HasButtonBar2 Then SendCommand 2944 1
        If HasMainHeader Then WinSetStyle 12582912 2
    EndIf
    SendCommand 2918
    If HasCurDir Then SendMessage(AUTORUN_TCHANDLE, 11, 1)
    WinRedRaw 2
EndFunc
[/cut]
Автозагрузка полноэкранно происходит.
Потом когда мне нужно перейти в оконный режим нажимаю F11, оно переходит в оконный режим, но окно не развернуло на весь экран.
Можно код подправить, чтоб оконный режим был развернутое на весь экран окно (не считая нижней панели Windows)?

Добавлено: Вс сен 14, 2025 11:41
Loopback
A55555 писал(а):чтоб при выходе по F11 из поноэкранного режима окно было развернуло на весь экран
В коде не предусмотрен учёт развернутого состояния окна. Если делать правильно (= универсально), надо читать ключ maximized из соответствующей разрешению секции, или из секции AllResolutions, в зависимости от настроек. Но честно говоря мне не хочется тратить на это время, поэтому просто добавьте функцию разворачивания здесь:

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

    Else
        PostMessage(AUTORUN_TCHANDLE, 1075, 65537)
        If HasButtonBar  Then SendCommand 2901 1
        If HasDriveBar   Then SendCommand 2902 1
        If HasDriveList  Then SendCommand 2906 1
        SendCommand 2907 1
        If HasTabHeader  Then SendCommand 2908 1
        If HasStatusBar  Then SendCommand 2909 1
        If HasCmdLine    Then SendCommand 2910 1
        If HasKeyButtons Then SendCommand 2911 1
        If HasButtonBar2 Then SendCommand 2944 1
        If HasMainHeader Then WinSetStyle 12582912 2
        # Разворачивает окно на весь экран
        WinSetState(3)
    EndIf

Добавлено: Вс сен 14, 2025 12:02
Orion9
A55555 писал(а):При нажатии этой кнопки у меня закрывается окно счетчика
Так и задумано. Первое нажатие на кнопку создает окно, второе закрывает. Кнопка только для тестов, чтобы не запускать каждый раз процесс копирования ради того, чтобы увидеть окна отсчета.
A55555 писал(а):не получается у окна счетчика поверх вот этого полноэкранного режима выйти.
Установил код от Flasher, но проблему воспроизвести не удалось. Пока не знаю, что сказать. И так и этак пробовал, но у меня всё нормально работает. А вообще, полноэкранный режим от Flasher довольно "сурово" выглядит. Оно, конечно, прикольно, но, на мой взгляд, слишком аскетично. Я обычно оставляю заголовок окна, меню и строку состояния. Не вижу большой пользы от скрытия этих элементов. Чай не век 800x600 разрешения живем, чтобы за каждый пиксель бороться.
A55555 писал(а):Если это целое дело, то не нужно, это уже такое.
Да нет, это не сложно, хотя уделять время Autorun и ТС в ближайшее дни-недели действительно больше не смогу. Однако то, что вы предлагаете, по хорошему, надо было сделать сразу. Замените с этой строки:

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

    SendMessage(h_WinShutdown, PBM_SETPOS, 0, 0) 
    Local seconds = 15  
    For i = 1 to seconds
        SendMessage(h_WinShutdown, PBM_SETPOS, Round(i/seconds*100,0), 0) 
        WinSetText("Выключение через " & seconds-i & " сек.", h_WinShutdown)
        Sleep(900)
        If g_Shutdown = 0 Then Break
    Next 
Через значение "seconds =" можно указывать количество секунд отсчета.
Loopback писал(а):Но честно говоря мне не хочется тратить на это время, поэтому просто добавьте функцию разворачивания здесь:
Я когда освобожусь, первым делом скорее всего возьмусь за этот код от Flasher - давно хотел заменить функционал TCFS2 на Autorun. И базу неплохую он для этого сделал, нужно только подстроить под себя.

Добавлено: Вс сен 14, 2025 19:01
Loopback
Версия от 14.09.2025

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

* внутренние изменения и оптимизации нового окна сообщений об ошибках
* убрана поддержка раннего метода возврата длинного текста, использовавшегося в GetSelectedItems с 2.2.15 по 2.2.19
- исправлено обрезание текста параметра при использовании вычисляемых строк в командной записи функций плагинов
Довольно существенные пришлось делать изменения для исправления, надеюсь ничего не сломал.

Добавлено: Вс сен 14, 2025 22:07
A55555
Loopback писал(а):
A55555 писал(а):чтоб при выходе по F11 из поноэкранного режима окно было развернуло на весь экран
В коде не предусмотрен учёт развернутого состояния окна. Если делать правильно (= универсально), надо читать ключ maximized из соответствующей разрешению секции, или из секции AllResolutions, в зависимости от настроек. Но честно говоря мне не хочется тратить на это время, поэтому просто добавьте функцию разворачивания здесь:
Спасибо, то что и хотелось.
Orion9 писал(а):
A55555 писал(а):не получается у окна счетчика поверх вот этого полноэкранного режима выйти.
Установил код от Flasher, но проблему воспроизвести не удалось. Пока не знаю, что сказать. И так и этак пробовал, но у меня всё нормально работает.
У меня тоже всё нормально уже.
Я использовал код для смещения окна, который Loopback мне недавно написал

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

WinAlign(h_WinShutdown, 0, DllCall("GetDesktopWindow"), 0, 600, -320) 
в перемешку с вашим.
Перейдя только на ваш вариант кода Поверх всех окон, смещения и т.д. у меня тоже стало всё нормально с выходом окна счетчика поверх всех окон.
Orion9 писал(а):Да нет, это не сложно, хотя уделять время Autorun и ТС в ближайшее дни-недели действительно больше не смогу. Однако то, что вы предлагаете, по хорошему, надо было сделать сразу. Замените с этой строки:

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

    SendMessage(h_WinShutdown, PBM_SETPOS, 0, 0) 
    Local seconds = 15  
    For i = 1 to seconds
        SendMessage(h_WinShutdown, PBM_SETPOS, Round(i/seconds*100,0), 0) 
        WinSetText("Выключение через " & seconds-i & " сек.", h_WinShutdown)
        Sleep(900)
        If g_Shutdown = 0 Then Break
    Next 
Через значение "seconds =" можно указывать количество секунд отсчета.
Спасибо, теперь намного проще количество секунд устанавливать.
[s]Но я имел ввиду, что вот эта зеленая полоса прогресса не синхронизируется под отличные от 100 секунд варианты, например под 15 секунд.[/s]
[cut]Изображение[/cut]
Уже и синхронизация полосы прогресса с количество секунд нормально заработала, сначала вроде не работало :? Спасибо.
Orion9 писал(а):Я когда освобожусь, первым делом скорее всего возьмусь за этот код от Flasher - давно хотел заменить функционал TCFS2 на Autorun. И базу неплохую он для этого сделал, нужно только подстроить под себя.
И если можно будет и это реально, если будет вдохновение на такое, сделайте пожалуйста кнопку на тему .torrent файлов.
Чтоб выделяешь .torrent файл, нажимаешь кнопку и оно на противоположной панели показывает файл/папку относящиеся к этому торрент файлу (скачанные через этот торрент файл) или пишет ничего не найдено (проводит поиск по всем дискам).
У меня на нескольких дисках много всякого и так получается, что всё оно сейчас не раздается (контент и сами .torrent файлы у меня на дисках), я собираюсь поштучно вносить через .torrent файлы это всё в клиент и было бы удобно быстро находить относящиеся к .torrent файлу папку/файл.

Добавлено: Пн сен 15, 2025 23:41
Orion9
A55555 писал(а):И если можно будет и это реально
С тем функционалом, который сечас есть в Autorun, это реально. Loopback, конечно, в подробностях знает формат торрент-файлов, но если исходить из самого простого, то можно просто проверять размер содержимого (каталога или файла) торрент-файла и сверять его с тем, что есть на диске. Результат будет с большой долей вероятности точным, т.к. количество байт у крупных объемов данных вряд ли может повториться. Недостаток такого подхода лишь один: не полностью скаченные раздачи (несколько серий сезона, несколько песен альбома и т.д) таким способом найтись не смогут, т.к. реальный объем данных не совпадает с заявленным. Возможен и обратный случай, когда в каталог полностью скаченной раздачи случайно попадают лищние файлы. Такие каталоги тоже не будут находиться, но в остальных случаях проблем не должно быть. Одиночные файлы будут находиться даже переименованными, ровно как и папки.
[cut]

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

RegisterCommand 70500 TorrentFindData

Global gTorrentSize = 0, gTorrentCount = 0, gDriveInclude = "e:\;f:\;g:\;h:\;i:\;j:"

Global h_WinFindTorr = 0
Global g_WinFindTorr = 0, g_FindTorrTask = 0
Global o_WinFindTorr = Callback("WinFindTorrProc", "hwnd;uint;wparam;lparam")

Func WinFindTorrProc(hWnd, uMsg, wParam, lParam)
    Static WM_CLOSE = 0x0010
    If uMsg = WM_CLOSE Then
       If DllCall("DestroyWindow", "handle", hWnd) Then
          h_WinFindTorr = 0        
          g_FindTorrTask = 0
       EndIf   
       Return 0
    EndIf
    Return DllCall("CallWindowProcW", "ptr", g_WinFindTorr, _
                                      "hwnd", hWnd, "uint", uMsg, "wparam", wParam, "lparam", lParam)
EndFunc

Func WinFindTorrentData()
    Local hIco    
    h_WinFindTorr = DllCall("CreateWindowExW", _
                            "dword", 0, _
                            "wstr", "msctls_progress32", _
                            "wstr", "", _
                            "dword", 0x00C80000, _
                            "int", 200, "int", 100, "int", Scale(400), "int", Scale(50), _
                            "handle", AUTORUN_TCHANDLE, _
                            "handle", 0, "handle", 0, "ptr", 0, _
                            "handle")
    If h_WinFindTorr = 0 Then Return 0
    WinAlign(h_WinFindTorr, 0, DllCall("GetDesktopWindow"))
    WinSetPos("", -Scale(50), "", "", 1, h_WinFindTorr)
    WinSetState(5, h_WinFindTorr)
    g_WinFindTorr = DllCall("SetWindowLong" & (auX64 ? "PtrW" : "W"), _
                            "hwnd", h_WinFindTorr, _
                            "int", -4, _
                            "long_ptr", o_WinFindTorr.Ptr, _
                            "ptr")      
    hIco = SendMessage(AUTORUN_TCHANDLE, 0x7f, 2, 0)                     
    SendMessage(h_WinFindTorr, 0x80, 0, hIco)
    WinSetStyle(PBS_MARQUEE, 2, h_WinFindTorr)    
    SendMessage(h_WinFindTorr, PBM_SETMARQUEE, 1, 0)
    WinSetText("Searching...", h_WinFindTorr)    
    g_FindTorrTask = 1
    While g_FindTorrTask
        Sleep(50)
    Wend
    h_WinFindTorr = 0
EndFunc

Func TorrentFindData()
    If h_WinFindTorr Then
       SendMessage(h_WinFindTorr, 0x0010, 0, 0)
       g_FindTorrTask = 0  
       Return
    Endif
    Static buf = Buffer(256)
    buf.Zero()
    Local nSymb = DllCall("GetLogicalDriveStringsW", "dword", buf.size, "ptr", buf.ptr)    
    If Not nSymb Then
       MsgBox("Не удалось получить список логических дисков" & auCRLF "SYSERROR: " & SYSERROR, "Autorun")
       Return
    EndIf    
    Local aDrive = list(), i = 0, sz, sDrives
    While 1
       sDrive = buf.GetStr(i)
       sz = StrLen(sDrive)
       if sz = 0 THEN break
       aDrive.add(sDrive)
       i = i + sz*2 + 2
    Wend
    sDrives = aDrive.text
    #MsgBox(sDrives)    
    Local obj = Plugin("TCTorrent")
    If ERROR <> 0 Then
       ShowHint("TCTorrent.wdx plugin error " & ERROR)
       Return
    Endif
    Local lRet = false 
    Local sPath = RequestCopyDataInfo("SP")    
    Local sName = RequestCopyDataInfo("SN")        
    Local sFile = sPath & sName
    If Not FileExist(sFile) Then 
       ShowHint("Файл не существует " & sFile)
       lRet = true
    ElseIf StrPos(FileGetAttr(sFile), "D") Then
       ShowHint("Каталог " & sFile)
       lRet = true       
    Else
       obj.FileName = sFile
       Local name =  obj.GetValue(0)
       Local size = obj.GetValue(2,0)	# size -> bytes       
       Local files = obj.GetValue(1)
       If files < 1 Then
          ShowHint("Файл не является торрент-файлом " & sFile)
          lRet = true        
       EndIf
    Endif
    Free(obj)
    If lRet Then Return
    IniRead gDriveInclude %COMMANDER_INI% "Autorun" "TorrentDrives" %"gDriveInclude"
    MsgBox("Поиск данных торрента:" & auCRLF & auCRLF & _
           "Имя: "    & name & auCRLF & _
           "Размер: " & size & auCRLF & _
           "Файлов: " & files & auCRLF & auCRLF & _ 
           "Диски поиска: " & gDriveInclude & auCRLF & auCRLF & _       
           "Продолжить?", "Autorun", 3+32+0)
    If EXTENDED <> 6 Then Return
    
    gTorrentSize = size
    h_WinFindTorr = 0
    gTorrentCount = 0
    RunThread "WinFindTorrentData"
    While g_FindTorrTask = 0
        Sleep(50)
    Wend
    Local found
    For i = 0 to aDrive.Count -1
        If StrPos(gDriveInclude, aDrive[i]) Then
         If files > 1 Then
            found &= FileFind(aDrive[i], "*.*", 1, 2, "PathList", "Func:FindTorrentDir") & auCRLF
         Else
            found &= FileFind(aDrive[i], "*.*", 1, 1, "PathList", "Func:FindTorrentFile") & auCRLF    
         EndIf   
        Endif   
    Next    
    If g_FindTorrTask = 0 Then    
       MsgBox("Поиск данных отменен" & auCRLF & auCRLF & _
              "Найдено: " & gTorrentCount & auCRLF & found, "", 48)
    Else 
       g_FindTorrTask = 0
       SendMessage(h_WinFindTorr, 0x0010, 0, 0)
       If DllCall("DestroyWindow", "handle", h_WinFindTorr) Then h_WinFindTorr = 0
       MsgBox("Найдено: " & gTorrentCount & auCRLF & found, "", 64)       
    EndIf     
EndFunc

Func FindTorrentFile(file)
    Static T1 = GetUptime()
    If Not g_FindTorrTask Then Return 0
    If Round(GetUptime() - T1, 0) > 200 Then 
       WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr)
       T1 = GetUptime()
       Sleep(5)
    EndIf         
    If file.size = gTorrentSize Then 
       gTorrentCount += 1
       Return 1
    EndIf
    Return 2
EndFunc

Func FindTorrentDir(file)
    Static T2 = GetUptime()
    If Not g_FindTorrTask Then Return 0
    If Round(GetUptime() - T2, 0) > 200 Then 
       WinSetText(" [" & gTorrentCount & "] " & file.FullPath, h_WinFindTorr)
       T2 = GetUptime()
       Sleep(5)
    EndIf   
    Local sz = FileFind(file.FullPath, "*.*", 1, 0, "TotalSize")  
    If sz = gTorrentSize Then 
       gTorrentCount += 1
       Return 1
    EndIf    
    Return 2
EndFunc
[/cut]
[cut]

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

TOTALCMD#BAR#DATA
70500

%COMMANDER_EXE%
Команда 70500


-1
[/cut]
В wincmd.ini сохраняется ключ:

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

[Autorun]
TorrentDrives=e:\;f:\;g:\;i:\;j:\
Здесь можно указать на каких дисках искать. Желательно исключить диски с каталогом Windows, до тех пор, пока не будет сделано под Everything, иначе будут заметные торомоза.
В общем, это пока только тестовая версия, могут быть косяки и недочеты, но в целом работает.
Loopback писал(а):надеюсь ничего не сломал
А где именно могло сломаться? Поклацал по последним кнопкам, ничего не заметил.

Добавлено: Вт сен 16, 2025 11:32
Loopback
Orion9 писал(а):А где именно могло сломаться?
Только если что-то в обработке параметров в командной записи. Остальное не затрагивалось.

Добавлено: Вт сен 16, 2025 12:08
Orion9
Перенесено из другой темы:
Loopback писал(а):
Orion9 писал(а):А вообще, посылка нажатий клавиш - одна из немногих фишек, которой до сих пор нет в Autorun. Я просил Loopback как-то добавить, но с этим есть сложности.
Не то чтобы сложности, просто много нюансов, соответственно есть ожидание, что времени придется потратить очень прилично. Учитывая, что есть многочисленные варианты - TCFS2, Autoit (в т. ч. AutoItX, который можно вызывать с DllCall), AHK - реализация постоянно откладывается куда-то в конец списка. Так оно и лежит в todo уже несколько лет.
Если можно, хотелось бы в справке видеть такой пример использования библиотеки AutoItX, можно сразу в статье к DllCall.
Loopback писал(а):Только если что-то в обработке параметров в командной записи. Остальное не затрагивалось.
Ясно. Я командной записью редко пользовался, в основном для чтения и записи в ini-файл, пока никаких проблем не заметил. Надеюсь, дальше все будет оставаться в порядке.

P.S.

Для тех, кто будет пользоваться кодом выше для поиска торрент-данных, если при выполнении возникнет ошибка "Переменная не определена: PBS_MARQUEE", необходимо добавить эти константы:
[cut]

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

Const PBM_SETPOS      =  1026, _
      PBM_SETRANGE    =  1025, _
      PBS_MARQUEE     =  0x08, _
      PBM_SETMARQUEE  =  1034
[/cut]
Нет, в этот раз я про них не забыл, просто их повторное появление в коде (а этот код был ранее) тоже приводит к ошибке. В общем, зря я с ними вообще связался, надо было их через static внутри функций делать, а не выносить отдельно в шапку. В будущем переделается.

Добавлено: Вт сен 16, 2025 18:22
yozhik
Loopback
Прошу прощения за тормоза в ответах. После правки у меня вот такое перестало работать:

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

ControlSetMouseAction /R /B:2 17 ShowPopupMenu /A:80 "%COMMANDER_PATH%\Profile\menus\F4Menu.mnu"
ControlSetMouseAction /R /B:2 17 ShowPopupMenu /A:80 %"COMMANDER_PATH" & "\Profile\menus\F4Menu.mnu"
ControlSetMouseAction /R /B:2 17 ShowPopupMenu /A:80 "c:\totalcmd\Profile\menus\F4Menu.mnu"
Т.е. ни одна из этих строк не работает. До последнего исправления был первый вариант (1), и он работал. После исправления я переписал эту строку с вычисляемой строкой (2), и с путём литерально (3) — не работает, меню по ПКМ не показывает. Пока откатился на прежнюю версию.
А вот эта работает:

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

ControlSetMouseAction /R /B:2 17 MsgBox "OK"

Добавлено: Вт сен 16, 2025 18:31
jentoso
yozhik
Действительно, после обновления , перестали работать действия к событиям мыши на панели функциональных клавиш.

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

ControlSetMouseAction /M:U /B:1 17 ShowPopupMenu /A:16 %COMMANDER_PATH%\Help\HINTS.MNU
ControlSetMouseAction /M:U /B:7 17 ShowPopupMenu /A:16 %COMMANDER_PATH%\Help\RESTART.MNU

Добавлено: Вт сен 16, 2025 20:04
Loopback
Orion9 писал(а): хотелось бы в справке видеть такой пример использования библиотеки AutoItX
Да я только вчера про него вспомнил, даже не тестировал, но думаю должно работать без проблем. Пример добавить можно. Во всяком случае до появления своего Send.

yozhik
jentoso
Ох уж эта ControlSetMouseAction, как я мог тогда додуматься до использования переключателей в параметрах функций обратного вызова... До сих пор отголоски этого сомнительного решения.

Забыл сделать исключение и обрабатывал переключатели как параметры, разумеется, перестало работать. Исправил. Помимо этого, на волне больших изменений, успел сделать еще кое-какой давно задуманный рефакторинг, так что возможны и другие косяки. Но надеюсь, что всё же нет.

Версия от 16.09.2025

Добавлено: Вт сен 16, 2025 21:23
yozhik
Loopback
Теперь порядок: и в КЗ, и в ControlSetMouseAction. Спасибо :)
Loopback писал(а):рефакторинг
Такое ощущение, что мой конфиг стал быстрее обрабатываться. Специально не проверял, но первое впечатление было.