Миниатюра приложения Vista

Миниатюра приложения на панели инструментов в Vista не обновляется при сворачивании приложения, поскольку само свернутое окно не перерисовывается. Для приложения мониторинга, которое у меня есть, было бы полезно обновить миниатюру приложения, пока приложение остается свернутым. Я использую Delphi 2009. Может ли кто-нибудь предложить хороший обходной путь для этого?

HMCG


person HMcG    schedule 02.06.2009    source источник


Ответы (6)


Это интересно, я думаю, это возможно каким-то образом с Windows API, я сейчас не на компьютере с Vista, но я думаю, что проигрыватель Windows Media по-прежнему показывает воспроизведение видео в свернутом виде.

Я предполагаю, что взлом состоял бы в том, чтобы переопределить кнопку свертывания и переместить форму за пределы экрана, а затем обнаружить, что форма снова становится активной, и переместить ее обратно в старое место. Это будет означать, что форма не видна, но не свернута.

person PeteT    schedule 02.06.2009
comment
Перемещение формы за пределы экрана, вероятно, сработает, но кажется немного бредом. Однако не то, чтобы боджи исключались............. HMcG - person HMcG; 02.06.2009
comment
Проигрыватель Windows Media действительно справился с этим трюком. Если, конечно, они просто не перекрывают кнопку свертывания и не перемещают форму за пределы экрана. - person HMcG; 02.06.2009
comment
Я поставил это хак, возможно, есть правильный метод, но если вам нужно, чтобы он работал, и вы не можете найти решение, я не думаю, что это вызовет какие-либо проблемы. - person PeteT; 02.06.2009
comment
На самом деле это очень хорошо работает на практике. Разрешите приложению сворачиваться, затем скрывать форму, восстанавливать, перемещать за пределы экрана и делать видимым. Обратите внимание, что восстановление после перемещения за пределы экрана снова возвращает форму на экран. В этой последовательности приложение обычно сворачивается. Я думаю, мне лучше задокументировать это сейчас, так что через 2 года я смогу понять, какого черта этот код здесь ... Ура - person HMcG; 03.06.2009

Я нашел кое-что в Microsoft форум разработчиков, посвященный этой теме. Вопрос касался способа предоставления пользовательского миниатюрного изображения, для которого Microsoft Леонардо Бланко ответил следующим образом:

Мы не [t] планируем предоставлять приложению средство для создания пользовательского альтернативного представления эскиза, но мы предоставим API, чтобы полностью отказаться от обычного изображения эскиза....

Судя по наличию в MSDN функций DwmSetIconicLivePreviewBitmap и DwmSetIconicThumbnail для Windows 7. Сейчас эти записи не содержат никаких объяснений, но их названия выглядят многообещающе.

Кто-то указал, что миниатюра для проигрывателя Windows Media показывает движущееся видео, даже когда окно свернуто. Объяснение Бланко:

WMP использует новый видеоконвейер, который взаимодействует напрямую с [Диспетчером окон рабочего стола] для обеспечения более плавного воспроизведения. Этот конвейер основан на [DirectX] и не зависит от информации о видимости окна, поэтому миниатюра может оставаться активной, даже если окно свернуто, пока приложение продолжает отправлять кадры. Однако вы можете заметить, что пользовательский интерфейс вокруг видео больше не работает (это сложно заметить, потому что пользовательский интерфейс вокруг видео обычно не обновляется). Дополнительные сведения об этом методе см. в API DwmSetPresentParameters.

Боюсь, я больше ничего не могу найти об этом. Документация по функциям DWM скудна.

Учитывая характер вашего приложения, возможно, стоит рассмотреть гаджет, чтобы жить на боковой панели Windows.

person Rob Kennedy    schedule 02.06.2009
comment
Спасибо за ссылку. На данный момент перемещение формы за пределы экрана вместо того, чтобы сводить к минимуму, помогает обойти проблему. Возможно, Windows 7 предложит лучшее решение в долгосрочной перспективе. - person HMcG; 03.06.2009

Я не знаю, работает ли это временное решение в Delphi 2009: переопределите CreateParams, чтобы установить GetDesktopWindow как WndParent.

person Stijn Sanders    schedule 02.06.2009
comment
Да, это все еще работает в D2009 в Vista, и вторая форма также имеет миниатюру, но миниатюра все еще не обновляется, когда приложение. сведен к минимуму. Однако полезный трюк, и перемещение второго окна за пределы экрана может дать мне желаемый эффект. Кстати, выполнение этого с модальным окном имеет некоторые интересные побочные эффекты...... - person HMcG; 02.06.2009
comment
Должен ли этот трюк быть необходим, если вы установили Application.MainFormOnTaskbar := true ? - person Vegar; 04.06.2009
comment
MainFormOnTaskBar был введен в Delphi 2007, если я не ошибаюсь, и этот трюк был задолго до этого. - person Stijn Sanders; 04.06.2009

В прошлом я изменил Application.Title, чтобы показать некоторую информацию на кнопке панели задач. Я не думаю, что это вызывает перерисовку значка?

person Brian Frost    schedule 02.06.2009
comment
Я не думаю, что OP спрашивает не о значке на панели задач, а о миниатюре (мини-скриншот), которая может отображаться в Vista, чтобы вы знали, что содержит окно, прежде чем переключиться на него. - person Scott W; 02.06.2009
comment
Изменение Application.Title больше не меняет заголовок кнопки панели задач. Изменение заголовка основной формы работает, но, к сожалению, не перерисовывает значок (или, возможно, перерисовывает его с тем же изображением). - person HMcG; 02.06.2009

В Delphi 2007 ваша основная форма находится на панели задач, если вы установите

  Application.MainFormOnTaskbar := True;

Чтобы поддерживать его обновление, вам нужно предотвратить свертывание вашего приложения и вместо этого просто переместить его на задний план. Это можно сделать, поместив в форму TApplicationEvents и назначив обработчик события OnMinimize, а затем вызвав там Application.Restore. Вы захотите отслеживать свое собственное состояние минимизации и убедиться, что вы скрыли все остальные формы (если они у вас есть) и чтобы была видна только ваша основная форма, но в самом низком Z-порядке, когда она «свернута».

Я не думаю, что Windows Vista позволяет вам перемещать формы с экрана, или вы могли бы просто сделать это. Может быть, есть взлом вокруг этого.

Удачи!

person Jim McKeeth    schedule 02.06.2009

перейдите в исходный проект и измените Application.MainFormOnTaskbar на false: Application.MainFormOnTaskbar := false;

С уважением, Маурисио

http://sourceforge.net/projects/tcycomponents/

person Community    schedule 26.07.2010