Difference between revisions of "Screenshot"
From Lazarus wiki
Jump to navigationJump to searchLine 32: | Line 32: | ||
==Example 2== | ==Example 2== | ||
− | Code from forum user ''Manlio''. | + | 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. | With Monitor=-1 it takes the whole desktop area, otherwise it takes only specific monitor. | ||
<syntaxhighlight lang="pascal"> | <syntaxhighlight lang="pascal"> | ||
+ | uses | ||
+ | LCLType, LCLIntf; | ||
+ | |||
procedure ScreenshotToFile(const Filename: string; Monitor: integer); | procedure ScreenshotToFile(const Filename: string; Monitor: integer); | ||
var | var |
Revision as of 23:21, 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. 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;