2

我使用 BitBlt() 和 CreateBitmapSourceFromHBitmap() 将窗口捕获为 BitmapSource,我可以在 WPF 应用程序的 Image 元素上显示该窗口。但由于某种原因,它捕获的大多数应用程序都是透明的。这是正在发生的事情的源与捕获图像:

https://userpages.umbc.edu/~smyth1/images/screencap.PNG
(来源:umbc.edu

它是灰色的,因为它所在窗口的背景是灰色的。无论我给窗口提供什么背景,都会显示出来。

如何让捕获的图像更准确地反映原始图像?

4

1 回答 1

4

您的代码中的问题可能是由于您正在使用的 Win32 API ( CreateCompatibleDC, SelectObject, CreateBitmap...)。我尝试了一个更简单的代码,只使用GetDCand 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 窗体和 WPF(带有Imaging.CreateBitmapSourceFromHBitmap)中进行了尝试,对于相同的屏幕截图(Firefox 中的 SO 页面),它在两种情况下都可以正常工作。

高温下,

于 2009-11-15T18:57:37.457 回答