Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

DWM Api les miniatures live de vista

Il y a des fois ou l’on s’arrête sur des petits détails, des technologies qu’on aimerait bien comprendre et maitriser même si on sait que cela ne sert a rien ou du moins que le champs des applications est faible. C’est ce qui m’est arrivé avec l’api DWM. Au début j’ai commencé a la regardé sans trop y prêter attention puis petit a petit j’ai voulu explorer chacun de ses pan afin de la comprendre un peu mieux.Le premier pan étudié était la transparence dans vista, j’ai d’ailleurs fait un article dessus (http://blogs.developpeur.org/xvanneste/archive/2006/05/31/21213.aspx ) Mais cette api ne fait pas que la transparence dans les fenêtres Windows, elle permet de récupérer les miniatures live dans nos applications. Tout le monde commence à connaitre vista et a savoir que le ALT+TAB ainsi que le WINDOW+TAB permet d’avoir un Switch entre les applications et que dans ce Switch on voit les applications qui s’exécute, c'est-à-dire que si vous avez Windows Media Player qui tourne vous avez le film ou la visualisation qui tourne dans la miniature du ALT+TAB ou du WINDOW+TAB. Et bien cette miniature live est gérer par DWMAPI. J’ai cherché sur le web et aucune publication sur le sujet (à croire que ca sert vraiment a rien) j’ai donc pris mon courage à deux mains et voila le résultat.Pour avoir les miniatures, il y a deux fonctions :La première permet d’enregistrer dans notre application les miniatures, on obtient donc des HANDLE sur des miniature live.

[DllImport("dwmapi.dll", PreserveSig = false)]

static extern void DwmRegisterThumbnail(int hwndDestination,int hwndSource,IntPtr pReserved,IntPtr phThumbnailId);

 

La deuxiéme permet de manipuler les HANDLE pour leur fournir des informations sur l’emplacement et la visibilité de la miniature (elle est masquée par defaut).

 

[DllImport("dwmapi.dll", PreserveSig = false)]

static extern void DwmUpdateThumbnailProperties(int hThumbnailId,IntPtr ptnProperties);

 

La première fonction prend en premier paramètre le HANDLE de la fenêtre qui affichera les miniatures, le second paramètre est le HANDLE de la fenêtre a mettre en miniature, le troisième paramètre est la taille de la miniature et le dernier est un paramètre de sortie qui est le HANDLE vers la miniature live créé pour notre application.La seconde fonction prend en paramètre le HANDLE vers votre miniature et une structure qui modifie les paramètres de localisation, de visibilité, et savoir si la zone cliente est seule prise en compte ou non dans la miniature.

Voici le code qui me permet d’utiliser cette première fonction :

public static int CreateThumbnail(Window wnd, int hwndSource)

{

if (!DwmIsCompositionEnabled())

return 0;

 

IntPtr hwnd = new WindowInteropHelper(wnd).Handle;

if (hwnd == IntPtr.Zero)

throw new InvalidOperationException("The Window must be shown before extending glass.");

IntPtr MyThumbnail = Marshal.AllocHGlobal(2); ;

SIZE size = new SIZE();

size.Width = 400;

size.Height = 400;

IntPtr pSize=new IntPtr();

pSize= Marshal.AllocHGlobal(8);

Marshal.StructureToPtr(size, pSize, true);

DwmRegisterThumbnail(hwnd.ToInt32(), hwndSource, pSize, MyThumbnail);

return Marshal.ReadInt32(MyThumbnail);

}

 

La structure SIZE est composé de 2 integer qui indique la largeur et la hauteur:

 

[StructLayout(LayoutKind.Sequential)]

public struct SIZE

{

public int Width;

public int Height;

}

 

Bien maintenant que j’ai enregistré la miniature pour l’application passé en paramètre de la fonction CreateThumbnail, je peux modifier les paramètres de ce HANDLE afin de l’afficher.La structure des propriétés du HANDLE est la suivante :

[StructLayout(LayoutKind.Sequential)]

public struct DWM_THUMBNAIL_PROPERTIES

{

public uint dwFlags;

public RECT rcDestination;

public RECT rcSource;

public byte opacity;

public bool fVisible;

public bool fSourceClientAreaOnly;

}

 

Le premier parametre de la structure est des flags qui indiquent quelle propriété de la structure est renseigné, voici les constantes :

private const uint DWM_TNP_RECTDESTINATION=0x00000001;

private const uint DWM_TNP_RECTSOURCE=0x00000002;

private const uint DWM_TNP_OPACITY=0x00000004;

private const uint DWM_TNP_VISIBLE =0x00000008;

private const uint DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010;

 

Le deuxième paramètre est le rectangle de destination ou se situera la miniature et le troisième paramètre est le rectangle source si il n’est pas renseigné c’est toute l’application qui est pris en compte ces propriété son des RECT, structure qui est définie comme suit :

[StructLayout(LayoutKind.Sequential)]

public struct RECT

{

public int left;

public int top;

public int right;

public int bottom;

}

 

Ensuite le troisième paramètre correspond à l’opacité de la miniature. Les deux derniers paramètres indiquent si la miniature doit être visible ou pas et si l’on ne prend que la zone cliente pour en faire une miniature.Voici le code qui utilise cette fonction :

public static void ShowThumbnail(int iThumbnail)

{

DWM_THUMBNAIL_PROPERTIES objThum = new DWM_THUMBNAIL_PROPERTIES();

objThum.dwFlags = DWM_TNP_RECTDESTINATION | DWM_TNP_VISIBLE | DWM_TNP_SOURCECLIENTAREAONLY;

objThum.fSourceClientAreaOnly = false;

objThum.fVisible = true;

objThum.opacity = (255 * 50) / 100;

RECT rect = new RECT();

rect.left = 250;

rect.top = 50;

rect.right = 650;

rect.bottom = 450;

objThum.rcDestination = rect;

int sizeObj = Marshal.SizeOf(objThum);

IntPtr pobjThumb = Marshal.AllocHGlobal(sizeObj);

Marshal.StructureToPtr(objThum, pobjThumb, true);

DwmUpdateThumbnailProperties(iThumbnail, pobjThumb);

}

 

public static void HideThumbnail(int iThumbnail)

{

DWM_THUMBNAIL_PROPERTIES objThum = new DWM_THUMBNAIL_PROPERTIES();

objThum.dwFlags = DWM_TNP_VISIBLE;

objThum.fVisible = false;

int sizeObj = Marshal.SizeOf(objThum);

IntPtr pobjThumb = Marshal.AllocHGlobal(sizeObj);

Marshal.StructureToPtr(objThum, pobjThumb, true);

DwmUpdateThumbnailProperties(iThumbnail, pobjThumb);

}

 

La première fonction affiche la miniature passe en paramètres, cette miniature se placera sur un rectangle de 250,50,650,450 je rappel que la taille avait été mise a 400x400, elle sera transparente a 50 pourcent et utilisera toute la fenêtre de l’application. La deuxième fonction cache la miniature passée en paramètre.

J’ai réalisé une application qui liste les applications qui tourne sur l’ordinateur et qui affiche la miniature de celle qui est sélectionnée. Voila le résultat :

 

L’application est téléchargeable avec les sources à l’adresse suivante :
http://www.francodotnet.org/Documents/CodesSources/tabid/95/Default.aspx

Publié mardi 6 juin 2006 11:46 par VANNESTE Xavier
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01