Difference between revisions of "Screenshot"

From Lazarus wiki
Jump to navigationJump to search
(categorize so far uncategorized page: add category: code)
 
(2 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{Components and Code examples}}
+
These code examples create the screenshot in the TBitmap object. You can then save this bitmap to a file.
These code examples create the screenshot in the TBitmap object. You can then save this bitmap to a file.  
 
  
 
==Example 1==
 
==Example 1==
Code from forum user ''fripster''. It supports Windows and Linux (at least GTK2).
+
This page has the cross-platform example: [[Developing with Graphics#Taking a screenshot of the screen]].
Bitmap takes the entire desktop area, including all monitors.
 
  
<syntaxhighlight lang="pascal">
+
This takes the whole desktop area (all monitors) and puts it into a TBitmap.
uses
 
  Graphics, LCLType, LCLIntf;
 
 
 
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}
 
</syntaxhighlight>
 
  
 
==Example 2==
 
==Example 2==
Line 80: Line 50:
 
end;
 
end;
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
 +
[[Category: Code]]

Latest revision as of 00:28, 16 November 2022

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;