スクリーンイメージをビットマップにコピーする (BitBlt WindowsAPIを用いたスクリーンキャプチャー) - C#

BitBlt WindowsAPIを用いて、スクリーンイメージをビットマップにコピーするコードを紹介します。

概要

アプリケーションからスクリーンキャプチャの画像を取得したい場合があります。 この記事ではC#のプログラムからスクリーンキャプチャを取得し、画像ファイルとして保存するコードを紹介します。

プログラム例

コード

下記のコードを記述します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace ScreenImageCapture
{
  public partial class FormMain : Form
  {
    enum TernaryRasterOperations : uint
    {
      SRCCOPY = 0x00CC0020,
      SRCPAINT = 0x00EE0086,
      SRCAND = 0x008800C6,
      SRCINVERT = 0x00660046,
      SRCERASE = 0x00440328,
      NOTSRCCOPY = 0x00330008,
      NOTSRCERASE = 0x001100A6,
      MERGECOPY = 0x00C000CA,
      MERGEPAINT = 0x00BB0226,
      PATCOPY = 0x00F00021,
      PATPAINT = 0x00FB0A09,
      PATINVERT = 0x005A0049,
      DSTINVERT = 0x00550009,
      BLACKNESS = 0x00000042,
      WHITENESS = 0x00FF0062,
      CAPTUREBLT = 0x40000000
    }

    [DllImport("gdi32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, 
      IntPtr hdcSrc, int nXSrc, int nYSrc, TernaryRasterOperations dwRop);


    [DllImport("user32.dll")]
    private static extern IntPtr GetDC(IntPtr hwnd);

    [DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]
    static extern IntPtr CreateCompatibleDC(IntPtr hdc);

    [DllImport("user32.dll")]
    private static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc);


    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      int screen_width = Screen.PrimaryScreen.Bounds.Width;
      int screen_height = Screen.PrimaryScreen.Bounds.Height;

      textBox_Output.Text += string.Format("スクリーンの幅:{0:d}\r\n",screen_width);
      textBox_Output.Text += string.Format("スクリーンの高さ:{0:d}\r\n", screen_height);

      Bitmap bmp = new Bitmap(screen_width, screen_height);
      Graphics g_bmp = Graphics.FromImage(bmp);
      IntPtr dc_bmp = g_bmp.GetHdc();

      IntPtr dc_scr = GetDC(IntPtr.Zero);

      BitBlt(dc_bmp, 0, 0, bmp.Width, bmp.Height, dc_scr, 0, 0, TernaryRasterOperations.SRCCOPY);

      g_bmp.ReleaseHdc(dc_bmp);
      g_bmp.Dispose();
      ReleaseDC(IntPtr.Zero, dc_scr);

      bmp.Save("capture.bmp");
    }
  }
}

プログラムの実行

プログラムを実行します。下図の画面が表示されます。


Button1をクリックします。画面の解像度が表示されます。


プログラムのフォルダに"capture.bmp"という名前の画像が作成されます。画像を開くとスクリーンキャプチャされた画像が表示されます。

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-04
作成日: 2012-01-29
iPentec all rights reserverd.