уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

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;

Для которой необходимо указать всего один параметр — хэндл миниатюры.
Вот пожалуй, на сегодня все.

Скачать исходник: Исходники —> Прочие
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
8 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
ter
ter
28/05/2010 09:01

у вас рабочий стол абсолютно пустой или отображается только фоновое изображение? (:

ter
ter
29/05/2010 10:49

интересно почему, например, при переключении по альт-таб картинка миниатюра рабочего стола со значками, а создается она там наверняка таким же способом.

ter
ter
31/05/2010 09:24

переписал этот код http://msdn.microsoft.com/en-us/library/aa969541%28VS.85%29.aspx
показывает с иконками (:
сравнил с вашим, вроде то же самое.

скопировал ваш код. падает при регистрации — запись по адресу х0.
добавил new(ph) которого почему то нет (: стал показывать.

B3nT3n
B3nT3n
01/03/2015 20:07

Никаких чудес
PH: PHTHUMBNAIL; // Ссылается неизвестно на что

Добавил
var
DH: HTHUMBNAIL;
PH: PHTHUMBNAIL;

PH := @DH;

Exception пропал

Сергей
Сергей
16/08/2015 17:25

При задании свойств Props.rcSource.Width и props.rcSource.Height можно получать и вполне крупные отображения того же качества, что данный способ вполне годится и для использования скриншотера нужного окна, без помех в работе если даже поверх будут другие окна, просто вопрос в оптимизации, в чем данный способ будет проигрывать функции printwindow? Кроме как не работоспособность на windows xp.