Обновление окна приложения в свернутом виде
Что интересно - WMP обновляет свое окно, только если проигрывается видео. А если проигрывается музыка и включена визуализация, то нет.
Хм, действительно. Наверно обновление присвоено только форме с видео, а всё остальное статично?
Что интересно, если у нас на форме имеется динамический контент (например, видео), то он будет отображаться в динамике.
page.php?id=11453
То есть WMP показывает не свое окно (как обычный плейер), а миниатюру
WindowsFormsExtensions.SetThumbnailClip(this, new Rectangle(new Point(0, 0), Size));
поэтому и показывается видео.
Дело в том что видео проигрывается и при виде аэропик, при котором показывается всё окно плеера в натуральный размер.
ProVal, еще раз:
если программа не поддерживает миниатюры, то в аэропике показывается окно программы: если оно не свернуто - показывается то что там есть, если свернута - показывается состояние окна на момент сворачивания
если программа поддерживает миниатюры, то в аэропике показывается то, что заложено в программе.
Johny-electric, ProVal, на этом сайте публикуется цикл статей о программировании возможностей таскбара. Lico привел пару ссылок. WMP вместо миниатюры предоставляет собственный миниинтерфейс.
Хотя, в случае с проигрыванием видео, думаю, WMP ничего специального не делает. Видео выводится на экран с помощью специального рендерера (оверлей, WMR, EVR и т.п.).
Обычные окна, когда хотят обновиться, ставят в очередь сообщение WMPAINT, а реальная отрисовка производится при обслуживании этого сообщения в порядке очереди. При минимизации окна, Винда просто подавляет эти сообщения, что бы приложение не тратило ресурсы системы на отрисовку невидимого. После восстановления окна, Винда шлет приложению WMPAINT на обновление всей площади окна.
Рендерер обновляет часть экрана в реальном времени и не пользуется очередью сообщений. Например, оверлей рендерит изображение сразу в видеопамять. А EVR (именно его использует WMP в Висте и 7) рендерит в DirectDraw поверхность. DWM весь рабочий стол "собирает" из таких DirectDraw поверхностей. По сути, рабочий стол - это 3-х мерная модель (хотя и выглядит она плоской), где текстурами являются те самые DirectDraw поверхности. При этом, финальный рендеринг рабочего стола производится непрерывно в реальном времени. Если какая-то из "текстур" изменила свое содержимое, то это сразу же отображается на экране.
Таким образом, приложению вообще не нужно обновлять свое окно для вывода видео. И это свойство распространяется на все копии "результата работы рендерера".
Вот
Johny-electric, ага. Это я тоже хотел, но это совсем другая тема. Мне нужно обновление при аэропике. Тоесть вот:
У меня свернут плеер, музыка играет, я навожу мышей на миниатюру и в аэропике все открытые окна выпадают в осадок, а окно плеера всплывает. Так вот оно-то всплыло, но не обновляется, тоесть висит просто как картинка до тех пор пока я его не разверну. А надо сделать так, чтобы при этом же сценарии окно работало (точнее отображалось) так, будто оно не свернуто, тоесть с анимацией.
Причем нужно узнать именно как реализовать это в самой программе. Зачем мне это надо? Просто хочу объяснить Артёму (автору аимпа), чего я от него хочу. И желательно сразу приблизительный рецепт как это сделать. Вот и ищу по инету рецепт, никак найти не могу.
ProVal, так вот тут же написано как сделать page.php?id=11438
Да, но там вроде не указывается, работает ли этот метод в случае свернутого приложения.
ProVal, еще раз... там описывается миниатюра, которая показывается в любом случае, хоть свернуто, хоть не свернуто.
Чёрт... да триста лет ненужна мне миниатюра. мне нужно окно свернутого приложения, всплывшее в аэропике. Сколько раз повторять.
зы. хотя если оно таки работает так как мне надо, то это гуд.
ProVal, еще раз... миниатюра - это часть окна приложения, как свернутого, так и нет. Частью может быть как часть окна, так и полностью всё окно.
Опаньки, в бета-версиях (1.5.х) Daum PotPlayer в превьюшке крутится видео даже когда плеер свёрнут! Прямо как в WMP12, только кнопок управления побольше.
А если попробывать банально? (на примере Delphi)
поместить на форму TIMER сделать интервал 10 мс и в процедуре написать
VideoFrame.Update
где VideoFrame - объект на который выводится видео (например Panel)
может сработает?