Difference between revisions of "Screenshot"
From Lazarus wiki
Jump to navigationJump to searchLine 51: | Line 51: | ||
X0 := M.Left; | X0 := M.Left; | ||
Y0 := M.Top; | Y0 := M.Top; | ||
− | W | + | W := M.Width; |
− | H | + | H := M.Height; |
end; | end; | ||
// prepare the bitmap | // prepare the bitmap | ||
BMP := Graphics.TBitmap.Create; | BMP := Graphics.TBitmap.Create; | ||
− | BMP.Width | + | BMP.Width := W; |
BMP.Height := H; | BMP.Height := H; | ||
BMP.Canvas.Brush.Color := clWhite; | BMP.Canvas.Brush.Color := clWhite; |
Revision as of 23:05, 22 January 2022
Example codes create the screenshot in the TBitmap object. You can then save this bitmap to a file. Bitmap takes the entire desktop area, including all monitors.
Example 1
Code from forum user fripster. It supports Windows and Linux.
procedure TakeScreenShot(b: Graphics.TBitmap);
{$IFDEF WINDOWS}
var
ScreenDC: HDC;
begin
b.Width:= Screen.DesktopWidth;
b.Height:= Screen.DesktopHeight;
b.Canvas.Brush.Color:= clWhite;
b.Canvas.FillRect(0, 0, b.Width, b.Height);
ScreenDC:= GetDC(GetDesktopWindow);
BitBlt(b.Canvas.Handle, 0, 0, b.Width, b.Height, ScreenDC, Screen.DesktopLeft, Screen.DesktopTop, SRCCOPY);
ReleaseDC(0, ScreenDC);
end;
{$ENDIF}
{$IFDEF LINUX}
var
ScreenDC: HDC;
begin
ScreenDC:= GetDC(0);
b.LoadFromDevice(ScreenDC);
ReleaseDC(0,ScreenDC);
end;
{$ENDIF}
Example 2
Code from forum user Manlio. With Monitor=-1 it takes the whole desktop area, otherwise it takes only specific monitor.
var
BMP: Graphics.TBitmap;
ScreenDC: HDC;
M: TMonitor;
W, H, X0, Y0: integer;
begin
X0 := Screen.DesktopLeft;
Y0 := Screen.DesktopTop;
W := Screen.DesktopWidth;
H := Screen.DesktopHeight;
// Monitor=-1 takes entire screen, otherwise takes specific monitor
if (Monitor >= 0) and (Monitor < Screen.MonitorCount) then begin
M := Screen.Monitors[Monitor];
X0 := M.Left;
Y0 := M.Top;
W := M.Width;
H := M.Height;
end;
// prepare the bitmap
BMP := Graphics.TBitmap.Create;
BMP.Width := W;
BMP.Height := H;
BMP.Canvas.Brush.Color := clWhite;
BMP.Canvas.FillRect(0, 0, W, H);
ScreenDC := GetDC(GetDesktopWindow);
// copy the required area:
BitBlt(BMP.Canvas.Handle, 0, 0, W, H, ScreenDC, X0, Y0, SRCCOPY);
ReleaseDC(0, ScreenDC);