Desktop Window Manager (DWM) в Windows Vista - 7 позволяет отображать миниатюры оконо запущеный приложений. Эти миниатюры не являются статичными и изменяются с течением времени в зависимости от того, что именно отображается в приложении. Например, если в FireFox переключить вкладку, то миниаюра окна приложения обновиться и будет содержать снимок новой вкладки.
С помощью DWM API можно создавать связи между различными окнами для отображения миниатюр. Например, Ваше приложение можно сделать приемником для миниатюр того же FireFox или любого другого окна, изменять уже созданные миниатюры приложений, а также использовать эффект стекла (glass) для окон. Про последнее (эффект стекла), кстати, вышла статья в журнале vr-online.ru. Так что про эффекты Вы всегда можете прочитать информацию здесь, а я продемонстрирую небольшой пример того, как можно легко превратить свое приложение в приемник миниатюр приложений.
Для работы нам понадобится совсем не много: приложение, состоящее из одной формы и кнопки на ней, а также подключеный в uses модуль DwmApi.
Наше приложение будет достаточно простым - мы будем получать миниатюру рабочего стола и отображать её на главной (и единственной) форме приложения.
Так будет выглядеть наш форма в начале:

Теперь заглянем в модуль dwmapi и обнаружим там следующую функцию:
function DwmRegisterThumbnail; external ModName name 'DwmRegisterThumbnail' delayed;
Функции необходимо указать следующие параметры:
hwndDestination: THandle - дескриптор окна, которое будет использоваться для отображения миниатюры;
hwndSource: THandle - дескриптор окна-источника миниатюры.
phThumbnailId: PHTHUMBNAIL - ссылка на дескриптор миниатюры.
Но зарегистрировать миниатюру в системе - это только полдела. Необходимо миниатюру ещё и отобразить. Для этого воспользуемся фторой функцией:
function DwmUpdateThumbnailProperties; external ModName name 'DwmUpdateThumbnailProperties' delayed;
Функции необходимо указать следующие входные параметры:
phThumbnailId: PHTHUMBNAIL - ссылка на дескриптор миниатюры.
ptnProperties: DWM_THUMBNAIL_PROPERTIES - структура, определяющая свойства миниатюры.
Теперь нам остается только разобрать практический пример.
Вот, собственно, готовая процедура для отображения миниатюры рабочего стола на форме приложения:
procedure TForm4.Button3Click(Sender: TObject); var PH: PHTHUMBNAIL; Props: DWM_THUMBNAIL_PROPERTIES; ProgmanHandle: THandle; begin ProgmanHandle:=0; ProgmanHandle:=FindWindow('Progman',nil); if ProgmanHandle>0 then begin if Succeeded(DwmRegisterThumbnail(Handle,ProgmanHandle,PH))then begin Props.dwFlags:=DWM_TNP_SOURCECLIENTAREAONLY or DWM_TNP_VISIBLE or DWM_TNP_OPACITY or DWM_TNP_RECTDESTINATION; Props.fSourceClientAreaOnly:=false; Props.fVisible:=true; Props.opacity:=100; Props.rcDestination:=Form4.ClientRect; if Succeeded(DwmUpdateThumbnailProperties(PH^,Props))then ShowMessage('Thumbnail готов') else ShowMessage('DwmUpdateThumbnailProperties false'); end else begin ShowMessage('DwmRegisterThumbnail False '); end; end; end;
Здесь мы вначале создали связь между окном нашего приложения и рабочим столом, причем окно приложения стало приемником миниатюры. Затем определили свойства миниатюры, а именно указали TRect в который необходимо вписать пиниатюру:
Props.rcDestination:=Form4.ClientRect;
А также указали прозрачность миниатюры:
Props.opacity:=100;
которая может изменяться в пределах от 0 (полностью прозрачная) до 255 (полностью непрозрачная).
Остальные свойства миниатюры для нас сегодня не значительны, но, если хотите узнать, что они означают - на описание в MSDN.
Теперь запустите приложение и посмотрите, что получится. У меня приложение приняло следующий вид:

Прямо поддержка скинов в собственном приложении :). Здесь следует отметить следующий момент - при смене изображения на рабочем столе автоматически будет изменяться и миниатюра.
Для того, чтобы разорвать связь между окном-примнеком и окном-источником, необходимо использовать функцию:
function DwmUnregisterThumbnail; external ModName name 'DwmUnregisterThumbnail' delayed;
Для которой необходимо указать всего один параметр - хэндл миниатюры.
Вот пожалуй, на сегодня все. Осталось только выложить исходник с примером из статьи. Вот он:
DWAPI(4.34 KB)
Последняя неделя напряженной учёбы для студентов, а потом - сессия и 1-2 месяца каникул. В это время многие студенты ищут выгодные вакансии для устройства на работу. А работа для студентов - это, можно сказать, источник для дальнейшего существования. Как давно это было. Хотя за последние 8 лет в этом году у меня будет первый полноценный отпуск - без вызовов на работу, форсмажоров и т.д. Красота :).
---------------------
| Делись! | Загружай! | Плюсуй! |
| | |









28 мая 2010 в 9:01 дп
у вас рабочий стол абсолютно пустой или отображается только фоновое изображение? (:
28 мая 2010 в 3:02 пп
Да нет, стол не пустой :) Просто отображается фон.
29 мая 2010 в 10:49 дп
интересно почему, например, при переключении по альт-таб картинка миниатюра рабочего стола со значками, а создается она там наверняка таким же способом.
29 мая 2010 в 2:07 пп
Надо посмотреть в MSDN описание всех флагов, может я чего упустил. Но вроде бы пробовал включать все флаги — иконок не было
31 мая 2010 в 9:24 дп
переписал этот код http://msdn.microsoft.com/en-us/library/aa969541%28VS.85%29.aspx
показывает с иконками (:
сравнил с вашим, вроде то же самое.
скопировал ваш код. падает при регистрации — запись по адресу х0.
добавил new(ph) которого почему то нет (: стал показывать.
31 мая 2010 в 10:28 дп
хы :) У меня работает…ничего не падает. Чудеса, мать их….