Screenshot

From Free Pascal wiki
Jump to navigationJump to search

These code examples create the screenshot in the TBitmap object. You can then save this bitmap to a file.

Example 1

This page has the cross-platform example: Developing with Graphics#Taking a screenshot of the screen.

This takes the whole desktop area (all monitors) and puts it into a TBitmap.

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 specified monitor.

uses
  Graphics, 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 specified 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;