Delphiで画面全体をスクリーンショット|GetDesktopWindowとCanvasでBitmap保存する方法
DelphiのVCLアプリケーションで、画面全体のスクリーンショットを取得して画像として保存したい場合、CanvasとTImageを使った方法が有効です。
このページでは、プライマリモニタだけでなくマルチモニタ環境にも対応したスクリーンキャプチャの実装方法を、GetWindowRectやScreen.DesktopRectを用いたコード例とともに解説します。
画面設計
「ファイル」⇒「新規作成」⇒「Windows VCLアプリケーション」をクリックしてプロジェクトを作成します。
フォームにTButtonを2個と、TImageを1つドラッグ&ドロップします。
ソースコードの記述
Button1をダブルクリックしてソースコードを記述します。
また、Button2もダブルクリックしてソースコードを記述します
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var Canvas:TCanvas;
h:HWND;
r1:TRect;
begin
//プライマリモニタ(主ディスプレイ)のスクリーンキャプチャを取得する
Image1.Proportional:=True;
Image1.Stretch:=True;
Self.Hide;
try
Sleep(500);
Canvas:=TCanvas.Create;
try
h:=GetDesktopWindow;
GetWindowRect(h,r1);
Canvas.Handle:=GetDC(h);
try
Image1.Picture.Bitmap.Width:=r1.Width;
Image1.Picture.Bitmap.Height:=r1.Height;
Image1.Picture.Bitmap.Canvas.CopyRect(r1, Canvas, r1);
finally
ReleaseDC(h,Canvas.Handle);
end;
finally
Canvas.Free;
end;
finally
Self.Show;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var Canvas:TCanvas;
h:HWND;
r1,r2:TRect;
begin
//マルチモニタ全体のスクリーンキャプチャを取得する
Image1.Proportional:=True;
Image1.Stretch:=True;
Self.Hide;
try
Sleep(500);
Canvas:=TCanvas.Create;
try
h:=GetDesktopWindow;
r1:=Screen.DesktopRect;
Canvas.Handle:=GetDC(h);
try
r2.Left:=0;
r2.Top:=0;
r2.Width:=r1.Width;
r2.Height:=r1.Height;
Image1.Picture.Bitmap.Width:=r1.Width;
Image1.Picture.Bitmap.Height:=r1.Height;
Image1.Picture.Bitmap.Canvas.CopyRect(r2, Canvas, r1);
finally
ReleaseDC(h,Canvas.Handle);
end;
finally
Canvas.Free;
end;
finally
Self.Show;
end;
end;
end.
実行
Button1をクリックすると、プライマリモニタ(主ディスプレイ)のみのスクリーンキャプチャを取得します。
Button2をクリックすると、マルチモニタ全体のスクリーンキャプチャを取得します。
以下はトリプルモニターの場合の例です。
