在delphi中使用大量内存获取screenShots

时间:2014-12-12 10:34:39

标签: delphi memory-management screenshot

之前已经问过这个问题,但问题是图片的大小,我的问题是内存的使用不断增加,直到程序崩溃

我们的想法是继续捕获桌面。

这是我的代码:

unit GetDesktop;
...
 function capture:tbitmap;
 var vDesktopDC: HDC;
 begin
  Result  := tbitmap.Create;
  vDesktopDC := GetWindowDC(GetDesktopWindow);
  try
   Result.PixelFormat := pf24bit;
   Result.Height := Screen.Height;
   Result.Width := Screen.Width;
   BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, vDesktopDC, 0, 0, SRCCOPY);
 finally
ReleaseDC(GetDesktopWindow, vDesktopDC);
end;

end;

-

unit main;
 ...
 procedure TForm4.Button1Click(Sender: TObject);
 var look:boolean;
 begin
 look := true;
 repeat
 application.ProcessMessages;
 image1.Picture.Bitmap:=capture;
 capture.Free;
 until look = false;

 end;

2 个答案:

答案 0 :(得分:3)

image1.Picture.Bitmap:=capture;
capture.Free;

这里capture是一个函数。你调用该函数两次,所以采取两个截图。您创建了两个新的位图,只释放其中一个。

您可以将capture的名称更改为GetScreenshot。然后声明一个名为Bitmap的本地变量。

var
  Bitmap: TBitmap;

然后将它们全部链接起来:

Bitmap := GetScreenshot;
try
  Image1.Picture.Assign(Bitmap);
finally
  Bitmap.Free;
end;

当然,将与图像控件相关联的位图传递给截屏函数并将其直接放在那里而不是中间位图可能会更清晰。

答案 1 :(得分:0)

嘘。我试过这个

procedure TForm4.Button1Click(Sender: TObject);
var look:boolean;
b:tbitmap;
begin
look := true;
repeat
application.ProcessMessages;
 try
b:=capture;
 image1.Picture.Bitmap:=b;
 finally
 FreeAndNil(b)
 end;
until look = false;

并且内存使用量稳定在7044 k(之前它的alooooot更多) 如果有人有更好的解决方案,那就太棒了:)。

HeartWare编辑:格式化上述代码的普遍接受的方式(不是我自己的风格)

procedure TForm4.Button1Click(Sender: TObject);
var
  Look : Boolean;
  b    : TBitmap;

begin
  look:=true;
  repeat
    Application.ProcessMessages;
    b:=capture;
    try
      image1.Picture.Bitmap:=b;
    finally
      FreeAndNil(b)
    end;
  until not look;
end;