Вопрос

Я использую BitBlt() и CreateBitmapSourceFromHBitmap() для захвата окна в качестве растрового источника, который я могу отобразить на элементе изображения в приложении WPF.Но по какой-то причине большая часть приложения, которое он захватывает, прозрачна.Вот источник противзапечатлейте изображение того, что происходит:

https://userpages.umbc.edu/~smyth1/images/screencap.PNG
(источник: umbc.edu)

Он серый, потому что фон окна, в котором он находится, серый.Какой бы фон я ни задал, окно будет просвечиваться.

Как я могу сделать так, чтобы захваченное изображение более точно отражало оригинал?

Это было полезно?

Решение

Проблема в вашем коде может быть связана с используемым вами Win32 API (CreateCompatibleDC, SelectObject, CreateBitmap...).Я попробовал использовать более простой код, используя только GetDC и BitBlt, и у меня это прекрасно работает.Вот мой код:

    public static Bitmap Capture(IntPtr hwnd)
    {
        IntPtr hDC = GetDC(hwnd);
        if (hDC != IntPtr.Zero)
        {
            Rectangle rect = GetWindowRectangle(hwnd);
            Bitmap bmp = new Bitmap(rect.Width, rect.Height);
            using (Graphics destGraphics = Graphics.FromImage(bmp))
            {
                BitBlt(
                    destGraphics.GetHdc(),
                    0,
                    0,
                    rect.Width,
                    rect.Height,
                    hDC,
                    0,
                    0,
                    TernaryRasterOperations.SRCCOPY);
            }
            return bmp;
        }
        return null;
    }

Я попробовал это в Windows Forms и WPF (с Imaging.CreateBitmapSourceFromHBitmap), это отлично работает в обоих случаях для одного и того же скриншота (страница SO в Firefox).

HTH,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top