我希望以最有效的方式获得屏幕快照。这将用于在其他计算密集程序(游戏)运行时在后台运行的程序中,并且我不想影响它们的性能(太多)。屏幕截图每秒会发生多次(10次)以上,所以我希望它尽可能快。
理想情况下,我正在寻找Delphi代码,但我愿意接受最好的代码。我发现this的第一个功能运行良好,任何人都可以确认/揭穿这是最快的方法吗?
此外,某些应用程序会抓取整个屏幕(例如天际),我认为它们会绕过上面使用的Window系统。以上链接无法获取这些图像。有没有人知道如何抓住它们?
答案 0 :(得分:2)
我想你的意思只是Windows应用程序? 但即使对于Windows,也没有办法像你提出的那样高效。 在许多计算机上,即使您的应用程序是唯一正在运行的应用程序,您也无法获得10+ FPS。 可能最有效的方法是使用镜像驱动程序,在这种情况下,你总是会有屏幕副本,但驱动程序也会影响性能,特别是在像3D游戏这样的繁重应用程序中。 (我甚至不会问你在第二次使用10+屏幕时要做什么,因为无论你用它们做什么,它都需要CPU或HDD时间,并且也会减慢3D应用程序的速度。)
Yoo当然不仅可以捕获整个屏幕,还可以捕获任何部分。你可以像这个例子一样使用bitblt:
procedure CaptureFromScreen(Dest: TBitmap; x, y, w, h, screenx, screeny: integer);
var
DC: hWnd;
begin
DC := GetDC(0);
if DC = 0 then
exit;
bitblt(dest.canvas.handle, x, y, w, h, DC, screenx, screeny, SRCCOPY);
ReleaseDC(0, DC);
end;
有时使用(CAPTUREBLT或SRCCOPY)代替SRCCOPY是有用的。它有助于捕获透明项目,但有一些副作用,例如光标可能会闪烁。 而且不确定如何从叠加中捕捉图片。如果你正在观看电影,很可能玩家将使用叠加和BITBLT返回区域填充一种颜色而不是图片。