1

我希望以最有效的方式获得屏幕快照。这将在其他计算密集型程序(游戏)运行时在后台运行的程序中使用,我不想影响它们的性能(太多)。屏幕截图每秒会出现多次(10+)次,所以我希望它尽可能快。

理想情况下,我正在寻找 Delphi 代码,但我愿意接受任何最适合此的代码。我发现它的第一个功能运行良好,任何人都可以确认/揭穿是最快的方法吗?

此外,某些应用程序会抓取整个屏幕(例如天际),我认为它们绕过了上面使用的 Window 系统。上面的链接无法获取这些图像。有谁知道如何抓住它们?

4

1 回答 1

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 返回区域填充一种颜色而不是图片。

于 2013-08-23T12:23:04.423 回答