Orion9

|
Posted: Sun May 03, 2026 13:00 Post subject: |
|
|
| 790 wrote: | | Обсуждать, в чём, по моему мнению, основной смысл "обновлений" запрещено правилами форума |
Ничего себе! А где в правилах форума об этом говорится?
Раз уж все высказали свое мнение, то я тоже, с вашего позволения, выскажу свое.
| 790 wrote: | | а смысл обновлений совсем в другом... |
Очевидно, под обновлениями вы подразумеваете что-то большое, грандиозное, броское, что "должно попасть на передовицы всех газет".
Ну хорошо. Возьмем, к примеру, видеоплеер. "В ТС появился встроенный плеер! В ТС появился встроенный плеер!", - кричали газеты. И казалось бы, действительно появилась фича, которая должна "наводить шороху" в пространстве ТС. Но так ли это?
А вот и нет. Напротив, добавление собственного плеера и есть пример неразумной продуктивности, напрасной траты усилий, нерациональности и схоластики. Почему? Потому что данную задачу изначально нужно было выполнять через отдельный плагин. Вон, мне болван сходу выдал всего-то сотню строк, как можно встроить MPC-плеер в окно скрипта
 Hidden text | Code: | #Requires AutoHotkey v2.0
; 1. Создаем GUI
MyGui := Gui("+Resize", "Embedded MPC-HC")
MyGui.OnEvent("Size", Gui_Size)
MyGui.OnEvent("Close", (*) => ExitApp())
; Добавляем контейнер (текстовое поле или просто пустую область), где будет плеер
; Это поможет нам позиционировать плеер внутри GUI
MyGui.AddText("vContainer w800 h450 +Border", "")
MyGui.Show()
; 2. Запускаем MPC-HC в режиме slave
; Передаем HWND нашего скрипта, чтобы плеер знал, кому слать отчеты
MpcPath := "c:\Program Files (x86)\K-Lite Codec Pack\MPC-HC\mpc-hc.exe" ; Проверьте путь!
MyHwnd := MyGui.Hwnd
;Run('"' MpcPath '" /slave ' MyHwnd, , , &MpcPID)
Run('"' MpcPath '"', , , &MpcPID)
; Ждем появления окна плеера
if !WinWait("ahk_pid " MpcPID, , 5) {
MsgBox "Не удалось запустить MPC-HC"
ExitApp
}
MpcHwnd := WinExist("ahk_pid " MpcPID)
; 3. Встраивание (Embedding)
; Убираем рамки и меню у MPC для чистого вида
WinSetStyle("-0xC00000", MpcHwnd) ; WS_CAPTION (убрать заголовок)
WinSetStyle("-0x80000", MpcHwnd) ; WS_SYSMENU (убрать системное меню)
; Делаем наше GUI родительским окном для MPC
DllCall("SetParent", "Ptr", MpcHwnd, "Ptr", MyHwnd)
; Начальная подгонка размера
MoveMpc()
;MyGui.Show()
; Функция для подгонки размера при изменении окна GUI
Gui_Size(thisGui, MinMax, Width, Height) {
if (MinMax = -1) ; Окно свернуто
return
MoveMpc()
}
MoveMpc() {
try {
; Получаем координаты нашего контейнера внутри GUI
MyGui["Container"].GetPos(&x, &y, &w, &h)
; Перемещаем плеер точно в эти координаты
WinMove(x, y, w, h, "ahk_id " MpcHwnd)
}
}
MoveMpc2() {
if !WinExist("ahk_id " MpcHwnd)
return
try {
MyGui["Container"].GetPos(&x, &y, &w, &h)
WinMove(x, y, w, h, "ahk_id " MpcHwnd)
}
}
; Пример управления через сообщения (Play/Pause)
#HotIf WinActive("ahk_id " MyHwnd)
Space:: {
; Код команды Play/Pause для MPC-HC часто 887 или через WM_COPYDATA
; Самый простой способ - отправить стандартную команду WM_COMMAND (0x111)
PostMessage(0x111, 887, 0, , "ahk_id " MpcHwnd)
}
#HotIf
MyGui.OnEvent("Close", GuiClose)
; В обработчике закрытия GUI:
GuiClose(*) {
; 1. Немедленно скрываем плеер, чтобы он не пытался перерисовываться
try WinHide("ahk_id " MpcHwnd)
; 2. Отключаем обработку изменения размеров, чтобы MoveMpc не вызвался случайно
MyGui.OnEvent("Size", (*) => 0)
; 3. Выводим плеер из состава GUI (возвращаем в Desktop)
; Это критично! Если этого не сделать, уничтожение MyGui уничтожит и дескриптор,
; на который завязан поток рендеринга MPC.
DllCall("SetParent", "Ptr", MpcHwnd, "Ptr", 0)
; 4. Посылаем команду закрытия (WM_CLOSE = 0x10)
PostMessage(0x10, 0, 0, , "ahk_id " MpcHwnd)
; 5. Ждем завершения процесса (не более 2 секунд)
if !ProcessWaitClose(MpcPID, 2)
ProcessClose(MpcPID) ; Жесткое завершение, если завис
ExitApp()
}
|
И все работает, все показывает, со всеми возможностями полноценного видеоплеера. Да, там есть свои нюансы, но я думаю, для человека, который 40 лет занимается программированием, не составило бы труда с ними разобраться.
Т.о. когда направление задано неверно, усилия направлены неверно, когда усилия направлены неверно, результат неверный. В итоге у Гислера получился и не плеер и не неплеер. Что-то среднее, непонятное, недоделанное; пользоваться таким невозможно да и не хочется.
То же самое можно сказать и про встроенный 7zip. Не понятно, зачем было столько услилий, когда давно есть рабочая обертка для полноценного 7z в виде готового плагина? В результате встроенным 7zip я не пользуюсь и вряд ли буду пользоваться.
Таковы примеры неразумной траты услий. А что же является примером разумной траты услилий? Все последние обновления в ТС 11.57 начиная от beta 1 до RC6. Почему? Потому что Total Commander это прежде всего файловый менеджер, а не видеоплеер или архиватор. И задача его как файлового менеджера предоставлять больше возможностей для менеджмента, навигации и взаиможействия с пользователем при работе с файлами и каталогами. Именно поэтому обновления в 11.57 это самые что ни на есть сливки (cream of cream), самая суть (core of the core) и то, как должна происходить разработка файлового менаджера.
А то, что вас маестро отфутболил, так это он может с каждым так поступить. И то, что простейшие вещи не делает, тоже общеизвестный факт. Всегда ведь можно достать карту "у меня 5789 топиков висит в предложениях" и ничего при этом не объяснить. И какая уж там сложность, мне интересно, сделать меню, всплывающее у указателя мыши? Меня самого это раздражает с момента появления OPENBARMENU.
А вот если бы Гислер вложился и сделал на заре ТС скриптовый язык для работы с ним изнутри, глядишь и просьб бы стало меньше. Нашлись бы пользователи, самостоятельно решающие задачи, которые сейчас без вмешательства со стороны разработчика решить невозможно. Вот и остается только бегать за ними и ждать его благоволения. Как там Flasher не раз отмечал "годами"... |
|