使用BitBlt捕获屏幕截图,如何
本文关键字:如何 屏幕截图 BitBlt 使用 | 更新日期: 2023-09-27 18:27:02
我在搜索中不时遇到这个"BitBlt",但我不知道如何使用它。
据人们所说,这似乎是捕捉Windows显示的屏幕的最快方法。然而,我自己不能对此发表任何意见,因为我没有让它发挥作用。
我唯一能尝试的方法是:
gfxBmp.CopyFromScreen(0,0,0,0 rc.Size,CopyPixelOperation.CaptureBlt);
我猜哪个用它?(rc.size=某个窗口的大小)遗憾的是,它没有任何作用,我得到了一张黑色的照片。但是,如果我使用SourceCopy,它是有效的,但这是正常的方法。
我目前正在尝试替换一些代码,使用BltBit,但它也不太好用:
public MemoryStream CaptureWindow(IntPtr hwnd, EncoderParameters JpegParam)
{
NativeMethods.Rect rc;
NativeMethods.GetWindowRect(hwnd, out rc);
using (Bitmap bmp = new Bitmap(rc.Width, rc.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb))
{
using (Graphics gfxBmp = Graphics.FromImage(bmp))
{
IntPtr hdcBitmap = gfxBmp.GetHdc();
try
{
NativeMethods.BitBlt(hdcBitmap, 0, 0, 0, 0, hwnd, 0, 0, 0xCC0020);
}
finally
{
gfxBmp.ReleaseHdc(hdcBitmap);
}
}
MemoryStream ms = new MemoryStream();
bmp.Save(ms, GetEncoderInfo(ImageFormat.Jpeg), JpegParam);
return ms;
}
}
你是对的,Graphics.CopyFromScreen已在内部使用BitBlt。以下是来自.NET 4.0 Framework的代码:
// [...]
new UIPermission(UIPermissionWindow.AllWindows).Demand();
int width = blockRegionSize.Width;
int height = blockRegionSize.Height;
using (DeviceContext deviceContext = DeviceContext.FromHwnd(IntPtr.Zero))
{
HandleRef hSrcDC = new HandleRef(null, deviceContext.Hdc);
HandleRef hDC = new HandleRef(null, this.GetHdc());
try
{
if (SafeNativeMethods.BitBlt(hDC, destinationX, destinationY, width, height, hSrcDC, sourceX, sourceY, (int)copyPixelOperation) == 0)
{
throw new Win32Exception();
}
}
finally
{
this.ReleaseHdc();
}
}
还有其他捕捉屏幕截图的可能性。您也可以使用WinAPI函数PrintWindow。
但对于图形卡加速的内容,两者都不起作用。硬件覆盖位于gpu内存中,在那里你无法访问它。这就是为什么你经常会得到视频、游戏等的黑色图像。。。