我使用 BitBlt() 和 CreateBitmapSourceFromHBitmap() 将窗口捕获为 BitmapSource,可以将其显示在 WPF 应用程序中的 Image 元素上。但由于某种原因,它捕获的大部分应用程序都是透明的。这是正在发生的事情的源与捕获图像:
(source: umbc.edu https://userpages.umbc.edu/~smyth1/images/screencap.PNG)
它是灰色的,因为它所在的窗口的背景是灰色的。无论我给窗口设置什么背景都会显示出来。
如何才能让拍摄的图像更准确地反映原始图像?
您的代码中的问题可能是由于您使用的 Win32 API (CreateCompatibleDC
, SelectObject
, CreateBitmap
...)。我尝试使用更简单的代码,仅使用GetDC
and 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 页面),这两种情况都可以正常工作。
HTH,
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)