将DWM缩略图添加为WPF控制孩子



我使用dwm缩略图创建一个窗口选择器,我想将这些缩略图添加为WPF StackPanel的孩子。我该怎么做?

在此代码中,我有一个Grid称为b

代码

[DllImport("dwmapi.dll", PreserveSig = false)]
private static extern bool DwmIsCompositionEnabled();
[DllImport("dwmapi.dll")]
private static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMargins);
[StructLayout(LayoutKind.Sequential)]
struct MARGINS
{
    public int Left;
    public int Right;
    public int Top;
    public int Bottom;
    public void ExtendToWholeClientArea()
    {
        this.Left = -1;
        this.Right = -1;
        this.Top = -1;
        this.Bottom = -1;
    }
}
[DllImport("dwmapi.dll")]
private static extern int DwmRegisterThumbnail(IntPtr dest, IntPtr src, out IntPtr thumb);
[DllImport("dwmapi.dll")]
private static extern int DwmUnregisterThumbnail(IntPtr thumb);
[DllImport("dwmapi.dll")]
private static extern int DwmQueryThumbnailSourceSize(IntPtr thumb, out PSIZE size);
[StructLayout(LayoutKind.Sequential)]
private struct PSIZE
{
    public int x;
    public int y;
}
[DllImport("dwmapi.dll")]
private static extern int DwmUpdateThumbnailProperties(IntPtr hThumb, ref DWM_THUMBNAIL_PROPERTIES props);
[StructLayout(LayoutKind.Sequential)]
private struct DWM_THUMBNAIL_PROPERTIES
{
    public int dwFlags;
    public RECT rcDestination;
    public RECT rcSource;
    public byte opacity;
    public bool fVisible;
    public bool fSourceClientAreaOnly;
}
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
    public RECT(int left, int top, int right, int bottom)
    {
        Left = left;
        Top = top;
        Right = right;
        Bottom = bottom;
    }
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}
private static readonly int DWM_TNP_VISIBLE = 0x8;
private static readonly int DWM_TNP_RECTDESTINATION = 0x1;
private static readonly int DWM_TNP_SOURCECLIENTAREAONLY = 0x00000010;
private void DrawThumbnail(WindowInfo win, int thumbnailIndex)
{ 
    IntPtr thumbnail = win.Thumbnail;
    if (thumbnail != IntPtr.Zero)
        DwmUnregisterThumbnail(thumbnail);
    int hResult = DwmRegisterThumbnail(mainWindowHandle, win.HWnd, out thumbnail);
    if (hResult == 0)
    {
        PSIZE size;
        DwmQueryThumbnailSourceSize(thumbnail, out size);
        DWM_THUMBNAIL_PROPERTIES props = new DWM_THUMBNAIL_PROPERTIES();
        props.dwFlags = DWM_TNP_VISIBLE | DWM_TNP_RECTDESTINATION | DWM_TNP_SOURCECLIENTAREAONLY;
        props.fVisible = true;
        props.fSourceClientAreaOnly = true;
        
        Grid b = new Grid() 
        { 
             Height = ThumbnailSize + 20, 
             Width = ThumbnailSize + WindowLeftOffset, 
             Background = (SolidColorBrush)(new BrushConverter().ConvertFrom("#55D3E6EE")), 
             Tag = UnSelectedTag,
             VerticalAlignment = VerticalAlignment.Stretch,
             HorizontalAlignment = HorizontalAlignment.Stretch
        };
        b.MouseLeftButtonDown += B_MouseLeftButtonDown;
        //Set the region where the live preview will be drawn ======> I want to add this region as a child for "b" grid 
        int left = (thumbnailIndex % MaxThumbnails) * (ThumbnailSize + ThumbnailSpacing)+ WindowLeftOffset;
        int top = (int)(thumbnailIndex / MaxThumbnails) * (ThumbnailSize + ThumbnailSpacing) + WindowTopOffset;
        int right = left + ThumbnailSize;
        int bottom = top + ThumbnailSize;
        props.rcDestination = new RECT(left, top, right, bottom);
        var bor = new Border() 
        { 
             BorderThickness = new Thickness(1), 
             BorderBrush = (SolidColorBrush)(new BrushConverter().ConvertFrom("#550863A2")), 
             CornerRadius= new CornerRadius(2) 
        };
        bor.Child = b;
        bor.SetValue(Canvas.LeftProperty, (double)(((drowingIndex % MaxThumbnails) * (ThumbnailSize + ThumbnailSpacing))+WindowLeftOffset - (WindowLeftOffset/2)-1));
        bor.SetValue(Canvas.TopProperty, Math.Floor((double)(drowingIndex / MaxThumbnails)) * (ThumbnailSize + ThumbnailSpacing));
        canvas.Children.Add(bor);
        drowingIndex++;
        previweStackPanels.Add(b);
        //Center the live preview
        if (size.x < size.y)
        {
            double ScaleFactor = ThumbnailSize / (double)size.y;
            int scaledX = (int)(size.x * ScaleFactor);
            int xOffset = (ThumbnailSize - scaledX) / 2;
            props.rcDestination.Left += xOffset;
            props.rcDestination.Right -= xOffset;
        }
        if (size.y < size.x)
        {
            double ScaleFactor = ThumbnailSize / (double)size.x;
            int scaledY = (int)(size.y * ScaleFactor);
            int yOffset = (ThumbnailSize - scaledY) / 2;
            props.rcDestination.Top += yOffset;
            props.rcDestination.Bottom -= yOffset;
        }
        DwmUpdateThumbnailProperties(thumbnail, ref props);
    }
}

a Panel,例如 GridStackPanel具有Children集合,您可以添加UIElement S:

previweStackPanels.Children.Add(b);

请注意,除了UIElement对象以外,您不能将其他任何内容添加到Panel

这意味着您不能Grid添加RECT,因为RECT不是UIElement。您可以添加System.Windows.Shapes.Rectangle

相关内容

  • 没有找到相关文章

最新更新