C# CopyFromScreenでフォームの枠内をキャプチャする

Windows フォーム アプリケーションでタイトルバーと枠以外透明なフォームを作り,枠内をキャプチャする機能を付ける.

CopyFromScreenメソッド

画面をキャプチャする方法はいくつかあるようだが,ここでは.Net Framework 2.0以降で提供されている,GraphicsクラスのCopyFromScreenメソッドを使う.

CopyFromScreenメソッドの構文は以下のとおりである.

public void CopyFromScreen(
	Point upperLeftSource,                 // 転送元の四角形の左上隅の点
	Point upperLeftDestination,            // 転送先の四角形の左上隅の点
	Size blockRegionSize,                  // 転送される領域のサイズ
	CopyPixelOperation copyPixelOperation  // CopyPixelOperation 値のいずれか
)

第四引数のcopyPixelOperationの値によっては,コピー元とコピー先の色を組み合わせたりできるが,今回はキャプチャするだけなので単純コピーのSourceCopyを指定する.
詳しくはCopyPixelOperationの詳しい内容は以下を参照.
http://msdn.microsoft.com/ja-jp/library/system.drawing.copypixeloperation.aspx

動作確認

フォームの枠内をキャプチャする関数を作った.ソースは以下の通り.

private void CaptureFrame()
{
    // 1.フォームの透明化
    this.TransparencyKey = this.BackColor;
    // 2.クライアント領域を表す四角形を取得
    var r = this.ClientRectangle;
    // 3.スクリーンキャプチャするためのBitmapオブジェクトの生成
    var bmp = new Bitmap(r.Width, r.Height, PixelFormat.Format32bppArgb);
    // 4.Graphicsオブジェクトの生成
    var g = Graphics.FromImage(bmp);
    // 5.転送元の左上座標取得
    var upperLeftSource = this.PointToScreen(new Point(0, 0));
    // 6.転送先の左上座標取得
    var upperLeftDestination = new Point(0, 0);
    // 7.CopyFromScreenメソッドでキャプチャ
    g.CopyFromScreen(
        upperLeftSource, upperLeftDestination,
        this.ClientSize, CopyPixelOperation.SourceCopy);
    // 8.確認用にファイル出力
    bmp.Save("capture.bmp", ImageFormat.Bmp);
}

以下は簡単なメモ.

1.フォームの透明化

フォームを透明にする.以下を参照.
C# Windows フォーム アプリケーションでフォームのクライアント領域を透明にする

2.クライアント領域を表す四角形を取得

クライアント領域のサイズを知りたいのでClientRectangleプロパティで取得する.

3. スクリーンキャプチャするためのBitmapオブジェクトの生成

幅と高さはクライアント領域と同じに.

4. Graphicsオブジェクトの生成

CopyFromScreenを使えるのがGraphicsオブジェクトなので,BitmapオブジェクトからGraphicsオブジェクト生成.

5. 転送元の左上座標取得

転送元は画面全体.キャプチャしたいのはフォームのクライアント領域.
クライアント座標を画面座標に変換するPointToScreenメソッドを使う.
クライアント領域の左上からキャプチャしたいので引数には(0, 0)を指定.

6. 転送先の左上座標取得

転送先はBitmapオブジェクトであるbmp.bmpの左上から描画できればよいので(0, 0)を指定.

7. CopyFromScreenメソッドでキャプチャ

転送するサイズである第三引数blockRegionSizeは,ClientSizeプロパティで取得する.

8. 確認用にファイル出力

ちゃんとキャプチャできてるかどうか確認するためにファイル出力.