Screenshot
From Lazarus wiki
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);