View previous topic :: View next topic |
Author |
Message |
Orion9

Joined: 01 Jan 2024 Posts: 832
|
(Separately) Posted: Mon Sep 08, 2025 20:11 Post subject: |
|
|
Loopback wrote: | Увы, идеально точно не получится |
Да ладно. Говорю же, это мелочи. Всё-равно мне показалось, что лучше стало.
Loopback wrote: | Да, как и было задумано |
Попробуем, когда доберуться руки.
В общем, поюзал я ТС с прозрачным окном в Win11... есть в этом что-то, но есть и недостаток. При посылке сообщения главному окну, оно скрывается и значок ТС на панели задач пропадает, затем снова появляется как ни в чем не бывало. Всё это напоминает, как ведет себя ТСх64 в аналогичной ситуации (без прозрачности), но там хотя бы окно не пропадает, а только значок, что не критично. Но здесь же... В общем, юзать такое сложно, если вообще возможно.
Сначала думал, что проблема в SendCommand или в WinRedraw(1), но дело не в этом. Ниже код для воспроизведения проблемы. Окно и значок на панели задач пропадают на секунду при условии, что установлена прозрачность:
Code: | RegisterCommand 60030 TestTransparencyBug
Func TestTransparencyBug(lParam)
SendMessage(AUTORUN_TCHANDLE, 11, 0, 0)
Sleep(1000)
SendMessage(AUTORUN_TCHANDLE, 11, 1, 0)
EndFunc |
Loopback, можно что-то с этим сделать, есть мысли?
A55555, когда писал тот большой пост, не было времени сразу все проверить. Так и знал, что что-нибудь да упущу. В общем, для полноценной работы функций подсчета потребуется еще одна вспомогательная функция:
 Hidden text Code: | Func ListDirectory(sPath, ByRef aList, nDepth = 1)
Local sFile, nAttr
Local ffd = Buffer(604)
Local hf = DllCall("FindFirstFileW", "wstr", sPath & "\*.*", "ptr", ffd.Ptr)
If hf <> 0 then
While True
sFile = ffd.GetStr(44) # cFileName
nAttr = ffd.GetNum(0, "dword") # dwFileAttributes
If BitAND(nAttr, 16) Then
If Not ((sFile = ".") Or (sFile = "..")) Then
aList.Add(sPath & "\" & sFile)
If nDepth <> 1 Then
ListDirectory(sPath & "\" & sFile, aList, nDepth - 1)
EndIf
EndIf
Else
aList.Add(sPath & "\" & sFile)
Endif
If DllCall("FindNextFileW", "handle", hf, "ptr", ffd.Ptr) = 0 Then Break
Wend
DllCall("FindClose", "handle", hf)
Endif
Free(ffd)
EndFunc |
Просто скопируйте ее в любое место файла конфигурации. Сейчас Autorun такие функции не нужны, у него есть свои более удобные функции для поиска и выборки файлов. Но это делалось давно, поэтому и забыл, т.к. она лежала у меня в совсем другом модуле. |
|
Back to top |
|
 |
AkulaBig
Joined: 03 Dec 2008 Posts: 431
|
(Separately) Posted: Mon Sep 08, 2025 21:11 Post subject: |
|
|
Loopback wrote: | Т.е. в DebugView ничего не пишет? Потому что улетать сейчас окно в любом случае не будет |
В текущей сборке просто это негде проверить. Хотя сейчас попробую на всякий случай.
Loopback wrote: | Залил временно к себе |
Спасибо. Все, можно удалять. В прошлый раз вы так написали, что я решил удалить тестовую сборку. Вроде как в ближайшее время не удастся ошибку исправить. А в этой версии в хистори вроде про это было. Вот я и начал кипишить. Но оказывается не совсем про это. Ниче, пусть теперь сборка лежит. Не буду ее удалять.
Добавлено спустя 7 минут:
Проверил. В текущей версии сборки с последним Autorun DebugView не выдает вообще никаких сообщений. Но может это из-за того, что вы-же тогда спец версии плагина выкладывали? Мне кажется в обычной версии и раньше никаких сообщений дебага не было.
Добавлено спустя 2 минуты:
А у всех главная страница форума до авторизации стала англоязычной? Похоже косяки какие-то.
Добавлено спустя 22 минуты:
Ну вот и произошло чудо. В тестовой версии окно больше не улетает за экран. Я имею ввиду, что со старой версией Autorun. Значит либо Винда в этом участвовала и ее обновление убрало ошибку. Либо шаман в бубен постучал. Будем считать вопрос исчерпан. Я даже не стал тестить с новой версией плагина. Ну и версия плагина в сборке не отладочная была. Так что дебаг никаких сообще6ний так и не вывел. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1607
|
(Separately) Posted: Mon Sep 08, 2025 23:33 Post subject: |
|
|
Orion9 wrote: | есть мысли? |
Нет, понятия не имею. Тестировать сегодня не могу, нет под рукой 11. Но думаю Autorun тут вообще не при делах. SendMessage просто обертка над системной функцией. Но WM_SETREDRAW это вообще такая специфическая штука, она не предполагает отключение на большие интервалы времени. Когда перерисовка выключена, от окна по сути остается картинка на экране. Предполагаю, что если в этот момент картинка будет чем-то стерта (может софт какой-то специфический стоит), это будет выглядеть как исчезновение окна.
AkulaBig wrote: | В текущей версии сборки с последним Autorun DebugView не выдает вообще никаких сообщений. Но может это из-за того, что вы-же тогда спец версии плагина выкладывали? |
Полную отладочную информацию я убрал, конечно, но одно сообщение в релизе оставил.
AkulaBig wrote: | В тестовой версии окно больше не улетает за экран. Я имею ввиду, что со старой версией Autorun. |
Ну вот, а вы всё - чудес не бывает...  |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 27
|
(Separately) Posted: Mon Sep 08, 2025 23:45 Post subject: |
|
|
Orion9 wrote: | A55555 wrote: | У меня опыта прикручивания готовых кнопок нет, поучусь. |
Не совсем понятно, что имеется в виду. Про копипрование кода кнопок на панель инструментов вы, наверное, знаете. А чтобы вызывать функции Autorun из кнопок ТС, для этого, как правило, регистрируется отдельный незанятый код в диапазоне 60000-100000 и указывается в соответствующей кнопке. Этот код можно использовать и в пользовательских em_командах, например, себе я сделал такую команду в файле usercmd.ini: |
С кнопками я разобрался.
Но с регистрацией кода проблема, по обеим кнопкам выскакивает сообщение "Функция не реализована. 620..."
Orion9 wrote: | A55555, когда писал тот большой пост, не было времени сразу все проверить. Так и знал, что что-нибудь да упущу. В общем, для полноценной работы функций подсчета потребуется еще одна вспомогательная функция: |
И добавление этой функции не изменило ситуацию.
К примеру. Папка TCTorrent плагина в моей готовой сборке находится в wlx плагинах по умолчанию.
Я отредактировал ваш код, сменив
Code: | ShowHint("TCTorrent.wdx plugin error " & ERROR)
.......
"Powered by TCTorrent.wdx" & auCRLF & _ |
на
Code: | ShowHint("TCTorrent.wlx64 plugin error " & ERROR)
.......
"Powered by TCTorrent.wlx64" & auCRLF & _ |
может проблема в том, что у меня 64bit сборка TC?
 Hidden text |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 832
|
(Separately) Posted: Tue Sep 09, 2025 00:40 Post subject: |
|
|
Loopback
Вроде логично изложили, но это не объясняет, почему значок с панели задач пропадает. В общем, как будет возможность, посмотрите - увидите о чем речь. А от WM_SETREDRAW отказаться, конечно, можно, но только в ущерб гладкой перерисовки экрана после выполнения тоталовских команд. И если будет стоять выбор между прозрачностью и гладкостью перерисовки, то я однозначно выберу второе.
A55555
Такая ошибка возникает, когда номер команды не зарегистрирован. Если вы скопировали все и сохранили в файл конфигурации, то, по идее, нужно только перезапустить ТС.
Допустим нужно зарегистровать команду с кодом 60100, которая будет вызывать функцию Test(). Тогда код на Autorun будет такой:
Code: | RegisterCommand 60100 Test
Func Test(lParam)
MsgBox("Команда 60100 выполнена")
EndFunc |
А кнопка такой:
Code: | TOTALCMD#BAR#DATA
60100
%COMMANDER_EXE%
Команда 60100
-1
|
Ваши изменения затрагивают только текст подсказки. Проблема незапуска в чем-то другом, на 64-битном ТС все работает. Попробуйте на таком простом коде, как 60100, сделать кнопку. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 832
|
(Separately) Posted: Tue Sep 09, 2025 19:19 Post subject: |
|
|
Хорошая мысля приходит напосля.
A55555
Добавил буквально три строчки к CopyMonitor(). Теперь при вкючении режима ожидания кнопка "В фоне" деактивируется, а при отключении режима ожидания снова активируется:
 Hidden text Code: | Func CopyMonitor()
Static hCopyWnd = 0
# Если монитор уже запущен - остановить
If g_CopyMonitor Then
g_CopyMonitor = false
Return
EndIf
hCopyWnd = WinFind(0, "TDLG2FILEACTIONMIN")
If hCopyWnd = 0 Then
ShowHint("Копирование не запущено", 0, 0, 1000, 1)
WinAlign(LAST_HINT_WINDOW)
Return
EndIf
g_CopyMonitor = true
# установка значения прозрачности
WinSetStyle(0x80000, 3)
DllCall("SetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _
"ptr", 0, "byte", 192, "dword", 2)
# поиск и блокирование кнопки "В фоне"
Local b = WinFind(hCopyWnd, _
(AUTORUN_TCARCH = 32 ? "TButton" : "Button"), (AUTORUN_TCARCH = 32 ? 2 : 1))
WinSetState(21, b)
#параметры подсказки
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Монитор выключения запущен, ожидание завершения копирования", 0, 0, 1000, 1)
SetHintParam("ShowHint", "Reload")
WinAlign(LAST_HINT_WINDOW)
While hCopyWnd <> 0
For i = 1 To 10
If Not g_CopyMonitor Then Break
Sleep(100)
Next
If Not g_CopyMonitor Then Break
hCopyWnd = WinFind(0, "TDLG2FILEACTIONMIN")
Wend
# разблокирование кнопки "В фоне"
WinSetState(20, b)
If g_CopyMonitor Then
g_CopyMonitor = false
WinShutdown()
Else
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Монитор выключения остановлен", 0, 0, 1000, 1)
SetHintParam("ShowHint", "Reload")
WinAlign(LAST_HINT_WINDOW)
EndIf
# отключение прозрачности
WinSetStyle(0x80000, 5)
EndFunc |
Одной проблемой меньше. Остались только диалоговые окна, которые могут неожиданно прервать операцию и оставить компьютер включенным до утра. Нужно подумать, что с этим делать, но на крайний случай можно добавить таймер, который будет в любом случае выключать компьютер через 2-3 часа после ухода. |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1607
|
(Separately) Posted: Tue Sep 09, 2025 20:25 Post subject: |
|
|
Orion9 wrote: | В общем, как будет возможность, посмотрите - увидите о чем речь. |
Не понадобилась даже 11, на десятке ведет себя ровно так же, и на 7, и даже XP. Сходу найти информацию по теме классическим методом не удалось, а нейросеть утверждает, что это несовместимость WS_EX_COMPOSITED и WM_SETREDRAW:
 Hidden text
Сочетание WS_EX_COMPOSITED и WM_SETREDRAW с параметром 0 приводит к исчезновению окна из-за фундаментального конфликта этих двух механизмов.
Стиль WS_EX_COMPOSITED переводит окно в режим двойной буферизации на уровне системы. Вся его отрисовка происходит в отдельном буфере в памяти, который затем целиком выводится на экран. Этот процесс требует, чтобы система постоянно могла обновлять этот буфер в ответ на любые изменения.
Сообщение WM_SETREDRAW с параметром 0 является директивой полностью заблокировать все процессы перерисовки для окна. Когда это сообщение применяется к окну с WS_EX_COMPOSITED, система лишается возможности поддерживать его буфер в актуальном состоянии. В результате она продолжает отображать последний известный "снимок" буфера, который, если обновления были заблокированы в самом начале, часто оказывается пустым или невалидным. Это приводит к визуальному исчезновению как самого окна, так и его значка в панели задач, который является его представлением.
Отправка WM_SETREDRAW с параметром 1 снимает блокировку. Система немедленно инициирует полную перерисовку, восстанавливая актуальное состояние буфера в памяти, что моментально возвращает окно и его значок на экран.
Вывод: Эти две технологии несовместимы. WS_EX_COMPOSITED требует постоянной фоновой перерисовки, которую WM_SETREDRAW явно запрещает. Для массовых обновлений в таком окне следует использовать другие методы (например, скрытие окна или методы конкретных контролов).
К таким ответам следует относиться с осторожностью, но насколько я могу судить, выглядит похоже на правду.
К слову, если не выполнять SetLayeredWindowAttributes, а только добавить WS_EX_COMPOSITED - окно тотала просто пропадает... |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 832
|
(Separately) Posted: Tue Sep 09, 2025 20:27 Post subject: |
|
|
Быстренько пробежался еще раз. Добавил комментариев и важную переменную bTransCopyWin, которой можно управлять прозрачностью окна копирования. По умолчанию выключена. Если нужно, чтобы во время копирования окно копирования тоже становилось прозрачным, включение через Local bTransCopyWin = true.
 Hidden text Code: | Func CopyMonitor()
Local bTransCopyWin = false # прозрачность окна копирования
Static hCopyWnd = 0
# Если монитор уже запущен - остановить
If g_CopyMonitor Then
g_CopyMonitor = false
Return
EndIf
# поиск окна копирования
hCopyWnd = WinFind(0, "TDLG2FILEACTIONMIN")
If hCopyWnd = 0 Then
ShowHint("Копирование не запущено", 0, 0, 1000, 1)
WinAlign(LAST_HINT_WINDOW)
Return
EndIf
# текущее состояние монитора
g_CopyMonitor = true
# установка прозрачности окна ТС
WinSetStyle(0x80000, 3)
DllCall("SetLayeredWindowAttributes", "hwnd", AUTORUN_TCHANDLE, _
"ptr", 0, "byte", 192, "dword", 2)
# опциональная прозрачность окна копирования
If bTransCopyWin Then
WinSetStyle(0x80000, 3, hCopyWnd)
DllCall("SetLayeredWindowAttributes", "hwnd", hCopyWnd, _
"ptr", 0, "byte", 192, "dword", 2)
EndIf
# поиск и блокировка кнопки "В фоне"
Local b = WinFind(hCopyWnd, _
(AUTORUN_TCARCH = 32 ? "TButton" : "Button"), (AUTORUN_TCARCH = 32 ? 2 : 1))
WinSetState(21, b)
# параметры подсказки
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Монитор выключения запущен, ожидание завершения копирования", 0, 0, 1000, 1)
# сброс параметров подсказки
SetHintParam("ShowHint", "Reload")
# центрирование подсказки
WinAlign(LAST_HINT_WINDOW)
# цикл ожидания периодический поиск окна копирования
While hCopyWnd <> 0
For i = 1 To 10
If Not g_CopyMonitor Then Break
Sleep(100)
Next
If Not g_CopyMonitor Then Break
hCopyWnd = WinFind(0, "TDLG2FILEACTIONMIN")
Wend
# разблокирование кнопки "В фоне"
WinSetState(20, b)
# цикл не был прерван повторным нажатием Ctrl+Alt+O
If g_CopyMonitor Then
g_CopyMonitor = false
WinShutdown()
Else
SetHintParam("ShowHint", "Font", 15, "Arial")
SetHintParam("ShowHint", "BackColor", 0xFF0000)
SetHintParam("ShowHint", "Text", 0xFFFFFF)
ShowHint("Монитор выключения остановлен", 0, 0, 1000, 1)
SetHintParam("ShowHint", "Reload")
WinAlign(LAST_HINT_WINDOW)
EndIf
# отключение прозрачности
WinSetStyle(0x80000, 5)
If bTransCopyWin Then WinSetStyle(0x80000, 5, hCopyWnd)
EndFunc |
Добавлено спустя 2 минуты:
Loopback
А что делать-то?  |
|
Back to top |
|
 |
Loopback
Joined: 07 Sep 2009 Posts: 1607
|
(Separately) Posted: Tue Sep 09, 2025 20:32 Post subject: |
|
|
Orion9 wrote: | А что делать-то? |
Orion9 wrote: | И если будет стоять выбор между прозрачностью и гладкостью перерисовки, то я однозначно выберу второе. |
Ну это же очевидно - использовать то, что нужнее.
Впрочем, технология в том числе предназначена и для уменьшения мерцания, попробуйте убрать функции отключения/включения перерисовки, возможно что самой двойной буферизации окажется достатчоно, чтобы WM_SETREDRAW не использовать. |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 27
|
(Separately) Posted: Tue Sep 09, 2025 23:54 Post subject: |
|
|
Orion9 wrote: | Добавил буквально три строчки к CopyMonitor(). Теперь при вкючении режима ожидания кнопка "В фоне" деактивируется, а при отключении режима ожидания снова активируется: |
Спасибо. Деактивируется.
Orion9 wrote: | Быстренько пробежался еще раз. Добавил комментариев и важную переменную bTransCopyWin, которой можно управлять прозрачностью окна копирования. По умолчанию выключена. Если нужно, чтобы во время копирования окно копирования тоже становилось прозрачным, включение через Local bTransCopyWin = true. |
Спасибо. Прозрачность работает для окна копирования.
Orion9 wrote: | A55555
Такая ошибка возникает, когда номер команды не зарегистрирован. Если вы скопировали все и сохранили в файл конфигурации, то, по идее, нужно только перезапустить ТС.
Допустим нужно зарегистровать команду с кодом 60100, которая будет вызывать функцию Test(). Тогда код на Autorun будет такой:
 Hidden text Code: | RegisterCommand 60100 Test
Func Test(lParam)
MsgBox("Команда 60100 выполнена")
EndFunc |
А кнопка такой:
 Hidden text Code: | TOTALCMD#BAR#DATA
60100
%COMMANDER_EXE%
Команда 60100
-1
|
Ваши изменения затрагивают только текст подсказки. Проблема незапуска в чем-то другом, на 64-битном ТС все работает. Попробуйте на таком простом коде, как 60100, сделать кнопку. |
Заработали кнопки, переносом этих команд в самое начало файла конфигурации Autorun.
RegisterCommand 62014 "TorrentSize" работает, показывает размер в подсказке возле курсора.
RegisterCommand 62013 "Duration" работает по Alt, остальные режимы по кнопке Ctrl_Shift_CapsLock выдают Error LoadLibrary MediaInfo.dll
Путь к своей библиотеке MediaInfo_x64.dll указал
Code: | Static sLib = "MediaInfo" & (auX64 ? "" : "_i386") & ".dll", _
hLib = DllCall("LoadLibrary", "wstr", COMMANDER_PATH & "\Plugins\wdx\TCMediaInfo\" & sLib, "ptr") |
 Hidden text
Last edited by A55555 on Wed Sep 10, 2025 00:05; edited 1 time in total |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 832
|
(Separately) Posted: Tue Sep 09, 2025 23:59 Post subject: |
|
|
Loopback
Убрал для эксперемента. Окно и значок на панели задач теперь не пропадают, но перерисовывается всё с заметными артефактами, как и ожидалось. Ладно, не беда. Прозрачность мне понравилась как лекарство от однообразия, буду юзать время от времени. Спасибо вам, что нашли причину и объяснение. Думаю, со временем добавлю в код проверку на стиль WS_EX_COMPOSITED, и если он включен, то не посылать WM_SETREDRAW.
A55555
Это значит, что путь к библиотеке MediaInfo.dll неправильно указан, скорее всего. К сожалению, его нужно указывать явно, как я и писал выше.
Добавлено спустя 4 минуты:
Quote: | Путь к своей библиотеке MediaInfo_x64.dll указал |
Нет, такое не предусмотрено. Библиотеки должны быть такими:
Code: | MediaInfo.dll
MediaInfo_i386.dll |
Просто создайте пока копию с такими именами. |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 27
|
(Separately) Posted: Wed Sep 10, 2025 00:08 Post subject: |
|
|
Orion9 wrote: | Нет, такое не предусмотрено. Библиотеки должны быть такими:
Code: | MediaInfo.dll
MediaInfo_i386.dll |
Просто создайте пока копию с такими именами. |
Этим способом заработало. Спасибо. |
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 832
|
(Separately) Posted: Wed Sep 10, 2025 00:23 Post subject: |
|
|
A55555
Да не за что. Надеюсь, вам эти функции еще не раз пригодятся, как и мне (а они мне очень даже зашли). Вот именно такими фичами и должен обрастаться коммандер - фичами, которые создают удобства и скрашивают повседневную жизнь. К сожалению, маэстро уже стар, чтобы это понимать, а ведь к таким проблемам и нуждам пользователей следует подходить с чистым и открытым умом ребенка ) |
|
Back to top |
|
 |
A55555
Joined: 06 Feb 2011 Posts: 27
|
(Separately) Posted: Wed Sep 10, 2025 13:55 Post subject: |
|
|
Orion9
если это не космически времязатратно, ваш механизм, который использует MediaInfo.dll, можно сделать чтоб он показывал какие аудиодорожки в видеофайле есть? Примерно вот так.
Code: |
AUDIO
1. RUS, DTS-HD, 3386 Kbs
2. RUS, AC3, 128 Kbs
3. ENG, AC3, 256 Kbs
... |
Может и видеопоток, примерно вот так
Code: | VIDEO
1. H265, 50 fps, 33850 Kbs |
|
|
Back to top |
|
 |
Orion9

Joined: 01 Jan 2024 Posts: 832
|
(Separately) Posted: Wed Sep 10, 2025 20:24 Post subject: |
|
|
A55555
Теоритически можно сделать такое, но сначала посмотрите режим "Видео (компактный)" в плагине TCMediaInfo. Думаю, это то, что вам нужно. Loopback сделал классный режим просмотра. Его можно использовать и в быстром просмотре по CTRL+Q, если нужно группу файлов просмотреть. |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|