WPF - Graphics.CopyFromScreen возвращает черное изображение - PullRequest
10 голосов
/ 19 апреля 2011

Следующий метод взят из приложения WinForms. Он просто захватывает экран, но мне нужно было изменить его для работы в приложении WPF. Когда я использую его, он возвращает черное изображение. Размеры правильные. У меня нет открытого DirectX или видео, и оно не будет работать даже на моем рабочем столе.

    public static Bitmap CaptureScreen()
    {
        // Set up a bitmap of the correct size

        Bitmap CapturedImage = new Bitmap((int)SystemParameters.VirtualScreenWidth,
            (int)SystemParameters.VirtualScreenHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

        // Create a graphics object from it
        System.Drawing.Size size = new System.Drawing.Size((int)SystemParameters.VirtualScreenWidth, (int)SystemParameters.VirtualScreenHeight);

        using (Graphics g = Graphics.FromImage(CapturedImage))
        {
            // copy the entire screen to the bitmap
            g.CopyFromScreen((int)SystemParameters.VirtualScreenWidth, (int)SystemParameters.VirtualScreenHeight, 0, 0,
                size, CopyPixelOperation.SourceCopy);
        }
        return CapturedImage;
    }

Может кто-нибудь показать мне ошибку в моих способах?

Ответы [ 2 ]

7 голосов
/ 19 апреля 2011

Я считаю, что вам нужно использовать Interop и метод BitBlt. Этот блог объясняет, как это делается, и последующее сообщение , в котором показано, как получить границы окна.

2 голосов
/ 19 апреля 2011

Я думаю, что первые два параметра g.CopyFromScreen должны быть 0.

Вот код, который работает для меня:

        var size = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
        var capture = new System.Drawing.Bitmap(size.Width, size.Height);

        var g = System.Drawing.Graphics.FromImage(capture);
        g.CopyFromScreen(0, 0, 0, 0, new System.Drawing.Size(size.Width, size.Height));
        g.Dispose();
...