スクリーンイメージをビットマップにコピーする (BitBlt WindowsAPIを用いたスクリーンキャプチャー)
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を愛用