Screenshot

From Lazarus wiki
Revision as of 23:22, 22 January 2022 by Trev (talk | contribs) (Fix English)
Jump to navigationJump to search

These code examples 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. It works on Windows. It gives blank-area bitmap on Linux GTK2, if you replace "GetDesktopWindow" to 0.

With Monitor=-1 it takes the whole desktop area, otherwise it takes only specific monitor.

uses
  LCLType, LCLIntf;

procedure ScreenshotToFile(const Filename: string; Monitor: integer);
var
  BMP: Graphics.TBitmap;
  ScreenDC: HDC;
  M: TMonitor;
  W, H, X0, Y0: integer;
begin
  // Initialize coordinates of full composite area
  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);
  // save to file (possibly to TStream, etc.)
  BMP.SaveToFile(Filename);
  BMP.Free;
end;