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;
Для которой необходимо указать всего один параметр — хэндл миниатюры.
Вот пожалуй, на сегодня все.
у вас рабочий стол абсолютно пустой или отображается только фоновое изображение? (:
Да нет, стол не пустой :) Просто отображается фон.
интересно почему, например, при переключении по альт-таб картинка миниатюра рабочего стола со значками, а создается она там наверняка таким же способом.
Надо посмотреть в MSDN описание всех флагов, может я чего упустил. Но вроде бы пробовал включать все флаги — иконок не было
переписал этот код http://msdn.microsoft.com/en-us/library/aa969541%28VS.85%29.aspx
показывает с иконками (:
сравнил с вашим, вроде то же самое.
скопировал ваш код. падает при регистрации — запись по адресу х0.
добавил new(ph) которого почему то нет (: стал показывать.
хы :) У меня работает…ничего не падает. Чудеса, мать их….
Никаких чудес
PH: PHTHUMBNAIL; // Ссылается неизвестно на что
Добавил
var
DH: HTHUMBNAIL;
PH: PHTHUMBNAIL;
…
PH := @DH;
Exception пропал
При задании свойств Props.rcSource.Width и props.rcSource.Height можно получать и вполне крупные отображения того же качества, что данный способ вполне годится и для использования скриншотера нужного окна, без помех в работе если даже поверх будут другие окна, просто вопрос в оптимизации, в чем данный способ будет проигрывать функции printwindow? Кроме как не работоспособность на windows xp.