private void InitialiseThumbnail(IntPtr source) { if (IntPtr.Zero != thumb) { // release the old thumbnail ReleaseThumbnail(); } if (IntPtr.Zero != source) { // find our parent hwnd target = (HwndSource)HwndSource.FromVisual(this); // if we have one, we can attempt to register the thumbnail if (target != null && 0 == DwmRegisterThumbnail(target.Handle, source, out this.thumb)) { ThumbnailProperties props = new ThumbnailProperties(); props.Visible = this.Visibility == Visibility.Visible; props.SourceClientAreaOnly = this.ClientAreaOnly; props.Opacity = (byte)(255 * this.Opacity); props.Flags = ThumbnailFlags.Visible | ThumbnailFlags.SourceClientAreaOnly | ThumbnailFlags.Opacity; DwmUpdateThumbnailProperties(thumb, ref props); } } }
internal bool Create() { lock (MainForm.Sync) { //attempt to register this darkages process to a thumbnail, 0 for success if (NativeMethods.DwmRegisterThumbnail(MainForm.Handle, Client.MainWindowHandle, out ThumbnailHandle) == 0) { //create a new thumbnail properties struct and set properties/location/size/etc var tProperties = new ThumbnailProperties { Visible = true, Flags = ThumbnailFlags.Visible | ThumbnailFlags.RectDestination | ThumbnailFlags.Opacity | ThumbnailFlags.SourceClientAreaOnly, Opacity = 255, OnlyClientRect = true }; //now determine the location of the thumbnail //first we convert this usercontrol's rect to a screen rect var screenRect = RectangleToScreen(DisplayRectangle); //clientrect will represent the mainform co-ordinates of this form var clientRect = MainForm.RectangleToClient(screenRect); tProperties.DestinationRect = new(clientRect.Left, clientRect.Top + 24, clientRect.Left + clientRect.Width, clientRect.Top + clientRect.Height); //update the thumbnail _ = NativeMethods.DwmUpdateThumbnailProperties(ThumbnailHandle, ref tProperties); return(true); } return(false); } }
public void SetDestinationRect(Rect destinationRect) { ThumbnailProperties properties = new ThumbnailProperties { Flags = ThumbnailFlags.RectDestination, Destination = destinationRect }; DwmUpdateThumbnailProperties(thumbnail, ref properties); }
public void SetSourceRect(Rect sourceRect) { ThumbnailProperties properties = new ThumbnailProperties { Flags = ThumbnailFlags.RectSource, Source = sourceRect }; DwmUpdateThumbnailProperties(thumbnail, ref properties); }
private void UpdateThumbnail() { if (IntPtr.Zero != thumb) { ThumbnailProperties props = new ThumbnailProperties { Visible = this.Visibility == Visibility.Visible, SourceClientAreaOnly = this.ClientAreaOnly, Opacity = (byte)(255 * this.Opacity), Flags = ThumbnailFlags.Visible | ThumbnailFlags.SourceClientAreaOnly | ThumbnailFlags.Opacity }; DwmUpdateThumbnailProperties(thumb, ref props); } }
internal void Destroy() { lock (MainForm.Sync) { //set thumbnail to invisible incase its not dead yet var tProps = new ThumbnailProperties { Visible = false, Flags = ThumbnailFlags.Visible }; //unregister the thumbnail _ = NativeMethods.DwmUnregisterThumbnail(ThumbnailHandle); _ = NativeMethods.DwmUpdateThumbnailProperties(ThumbnailHandle, ref tProps); Hide(); MainForm = null !; Client = null !; } }
internal static extern int DwmUpdateThumbnailProperties(IntPtr hThumbnailId, ref ThumbnailProperties thumbProps);
protected static extern void DwmUpdateThumbnailProperties(IntPtr thumbnailHandle, ref ThumbnailProperties properties);
public static extern int DwmUpdateThumbnailProperties(IntPtr HThumbnail, ref ThumbnailProperties props);
public static extern int UpdateThumbnailProperties(IntPtr HThumbnail, ref ThumbnailProperties props);
public static extern void DwmUpdateThumbnailProperties( IntPtr thumbnailHandle, ref ThumbnailProperties properties );
// this is where the magic happens private void Thumbnail_LayoutUpdated(object sender, EventArgs e) { if (IntPtr.Zero == thumb) { InitialiseThumbnail(this.Source); } if (IntPtr.Zero != thumb) { if (!target.RootVisual.IsAncestorOf(this)) { //we are no longer in the visual tree ReleaseThumbnail(); return; } DwmQueryThumbnailSourceSize(this.thumb, out WPF.SysSize size); Rect visib = WPF.GetVisibleArea(this); ThumbnailProperties props = new ThumbnailProperties(); if (visib == Rect.Empty) { props.Visible = false; props.Flags = ThumbnailFlags.Visible; } else { double ratioSrc = (double)size.Width / (double)size.Height; double ratioDest = visib.Width / visib.Height; // Center the thumbnail in the visible area double newSize; if (ratioSrc > ratioDest) { newSize = visib.Height * ratioDest / ratioSrc; visib.Y += (visib.Height - newSize) / 2.0; visib.Height = newSize; } else { newSize = visib.Width * ratioSrc / ratioDest; visib.X += (visib.Width - newSize) / 2.0; visib.Width = newSize; } // Translate to screen pixels Point a = target.RootVisual.PointToScreen(visib.TopLeft); Point b = target.RootVisual.PointToScreen(visib.BottomRight); Point w = Application.Current.MainWindow.PointToScreen(new Point(0, 0)); props.Destination = new WPF.SysRect( (int)Math.Ceiling(a.X - w.X), (int)Math.Ceiling(a.Y - w.Y), (int)Math.Ceiling(b.X - w.X), (int)Math.Ceiling(b.Y - w.Y)); props.Visible = this.Visibility == Visibility.Visible; props.Flags = ThumbnailFlags.Visible | ThumbnailFlags.RectDestination; } DwmUpdateThumbnailProperties(thumb, ref props); } }
internal static extern int DwmUpdateThumbnailProperties(IntPtr hThumbnailId, ref ThumbnailProperties thumbProps);
internal static extern int DwmUpdateThumbnailProperties(IntPtr HThumbnail, ref ThumbnailProperties props);
private static extern int DwmUpdateThumbnailProperties(IntPtr thumb, ref ThumbnailProperties props);