之前已经问过这个问题,但问题是图片的大小,我的问题是内存的使用不断增加,直到程序崩溃
我们的想法是继续捕获桌面。
这是我的代码:
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;
答案 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;