Получить максимальное окно при использовании Application.Current.Windows?

У меня есть код, который собирает все окна, связанные с приложением, отображает их в виде растровых изображений и сохраняет их в List<BitmapSource> для последующей обработки и обработки.

Моя проблема в том, что если окно свернуто, изображение представляет собой просто увеличенную панель инструментов, а не изображение всего окна. Есть ли способ убедиться, что я захватил увеличенное окно или, может быть, развернул все окна, прежде чем я их соберу?

Редактировать: я бы предпочел не разворачивать все окна только для того, чтобы делать снимки экрана, если у пользователя есть минимизированные.

Вот соответствующий код:

    public static List<BitmapSource> RenderWindows()
    {
        var windows = Application.Current.Windows
                                         .OfType<Window>()
                                         .Where(x => x.GetType() != typeof(AskAQuestionDialog) & x.GetType() != typeof(SelectScreenShots));

        var bitmaps = new List<BitmapSource>();

        foreach (var window in windows)
        {
            var bitmap = new RenderTargetBitmap((int)window.Width, (int)window.Height, 96d, 96d, PixelFormats.Default);
            bitmap.Render(window);

            bitmaps.Add(bitmap);
        }

        return bitmaps;
    }

person Adam    schedule 07.01.2014    source источник


Ответы (1)


Я использую следующую функцию для получения «скриншотов» всех окон приложений (работает также с свернутыми окнами)

    /// <summary>
    /// Gets a JPG "screenshot" of the current UIElement
    /// </summary>
    /// <param name="source">UIElement to screenshot</param>
    /// <param name="scale">Scale to render the screenshot</param>
    /// <param name="quality">JPG Quality</param>
    /// <returns>Byte array of JPG data</returns>
    public static byte[] GetJpgImage(this UIElement source, double scale, int quality)
    {
        double actualHeight = source.RenderSize.Height;
        double actualWidth = source.RenderSize.Width;

        double renderHeight = actualHeight * scale;
        double renderWidth = actualWidth * scale;

        RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
        VisualBrush sourceBrush = new VisualBrush(source);

        DrawingVisual drawingVisual = new DrawingVisual();
        DrawingContext drawingContext = drawingVisual.RenderOpen();

        using (drawingContext)
        {
            drawingContext.PushTransform(new ScaleTransform(scale, scale));
            drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));
        }

        renderTarget.Render(drawingVisual);

        JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
        jpgEncoder.QualityLevel = quality;
        jpgEncoder.Frames.Add(BitmapFrame.Create(renderTarget));            

        byte[] imageArray;

        using (MemoryStream outputStream = new MemoryStream())
        {
            jpgEncoder.Save(outputStream);
            imageArray = outputStream.ToArray();
        }

        return imageArray;
    }

чтобы получить список изображений

        List<ImageSource> list = new List<ImageSource>();
        WindowCollection collection = Application.Current.Windows;
        TypeConverter tc = TypeDescriptor.GetConverter(typeof(ImageSource));
        for (int i = 0; i < collection.Count; i++)
        {
            byte[] imgBytes = ScreenShot.GetJpgImage(collection[i], 1, 90);
            ImageSource img = (ImageSource)tc.ConvertFrom(imgBytes);
            list.Add(img);
        }
person phil    schedule 07.01.2014
comment
Что он рисует для максимизированных окон? - person Gabe; 07.01.2014
comment
@Gabe, в моем методе рисуется окно. - person Adam; 07.01.2014
comment
вы всегда получаете полный экран окна без рамки - person phil; 07.01.2014
comment
К сожалению, я хотел спросить, что он рисует для свернутого окна. - person Gabe; 07.01.2014
comment
Он просто показывал панель инструментов окна. @фил, твой метод показал мне, что не так. Я использовал window.Width и window.Height для размеров в RenderTargetBitmap, когда я должен был использовать window.RenderSize.Width и window.RenderSize.Height - person Adam; 07.01.2014