bakuchan.com

プログラミングなコーナ

Windows Programming なコーナーを作ってみました。 開発環境は、Microsoft VisualStudio C++ Express Edition で .NET(3.5)で動くようなものを考えています。

画面キャプチャソフトを作ってみる。

画面キャプチャ、スクリーンショットともいう、とにかく画面を 撮影したい、という目的を果たすためのソフトです。 「PrintScreen」ボタンを押して、 「ペイント」で貼り付けたらいいというものありますが、 私がものすごくめんどくさがりなので、 画面キャプチャソフト(PF-KAMERA:無料ソフト)を作りました。 (PF-KAMERA)はMFCで書かれていますが、 ここでは.NETプログラミングで作る方法を書きたいと思います。
画面キャプチャソフトの作り方のうち、PictureBoxを使う方法は他のサイトで紹介されています。 ここでは、PicutureBoxを使わない方法を紹介したいと思います。

.NET(C++)で見た画面キャプチャ

.NETの場合は
Bitmap
Image
Graphics
の三つのクラスだけを使います。 VisualStudioを使う場合、 まず、プロジェクトの新規作成を行います。 次に、Form1にボタンを一つつけてください。 つけたボタンをダブルクリックすると、 ボタンの動作を記述するコード(Form1.h)が表示されます。
それではボタンの動作、の中身を書いていきます。
private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
//ここから
	Screen^ screen;screen=Screen::PrimaryScreen;//第一画面を取得
	System::Drawing::Rectangle rc=screen->Bounds;//第一画面のサイズを取得
	Bitmap^ myBitmapScreen=gcnew Bitmap(rc.Width,rc.Height);//第一画面のサイズをもとにBitmapを作成
	Image^ imgScreen=myBitmapScreen;//BitmapでImageを初期化。これで保存の準備完了
	Graphics^ g= Graphics::FromImage(imgScreen);//ImageでGraphicsを初期化、これで画面のはりつけ準備完了
	g->CopyFromScreen(0,0,0,0,rc.Size);//画面をImageにはりつけ
	imgScreen->Save("名前を付けて保存.bmp");//Imageの画像を名前を付けて保存
//ここまで書き込む
}

MFCで見た画面キャプチャ

MFCを用いたプログラミングでは、 Windows95APIのお世話にいろいろとなるわけでして、中でも次の3つのお世話になるわけです。
HWND、ウィンドハンドル
HDC、デバイスコンテキストのハンドル
HBITMAP、ビットマップハンドル
これにCImageを加えて、画面の保存を行います。 MFCだとこんな感じになります。
//ここから(ソース1)
CWnd cWnd;//Windowクラス.MFC
CWindowDC cWndDC;//WindowDCクラス.MFC
CDC  *pDC;//デバイスコンテキストクラスへのポインタ.MFC

HWND hWnd;//ウィンドハンドル
HDC hDC;//デバイスコンテキストのハンドル
HBITMAP hBitmap;//ビットマップハンドル

cWnd.GetDesktopDC();//画面を取得
cWndDC=cWndDC(&cWnd);//画面のデバイスコンテキストを取得
hDC=cWndDC.m_hDC;//画面のデバイスコンテキストのハンドルを取得

int nSizeX=GetSystemMetrics(SM_CXSCREEN);//画面の横幅を取得;
int nSizeY=GetSystemMetrics(SM_CYSCREEN);//画面のたて幅を取得;

hBitmap=CreateCompatibleBitmap(hDC,nSizeX,nSizeY);
/*取得した画面のデバイスコンテキストのハンドルと
画面サイズからhBitmapに画面をはりつけます*/


cWndDC.DeleteDC();//画面のデバイスコンテキストを解放。これをしないとエラーになります。
//ここまで(ソース1)
この時点でhBitmapには、画面の画像が格納されています。
hBitmapの保存ですが、ATLのCImageクラスを使うなら、
//ここから(ソース2)
CImage image;//CImageクラス
HRESULT hResult;//CImageクラスへの処理の結果を格納
CDC* pCImageDC;//CImageクラスのためのデバイスコンテキストクラスへのポインタ.MFC
HDC hCImageDC;//CImageクラスのためのデバイスコンテキストのハンドル


image.Attach(hBitmap);//CImageにhBitmapをはりつけ
pCImageDC = CDC::FromHandle(image.GetDC());//CImageクラスからデバイスコンテキストクラスへのポインタを取得
hCImageDC=pCImageDC->m_hDC;//CImageクラスのデバイスコンテキストクラスへの
             //ポインタからデバイスコンテキストのハンドルを取得
hResult=image.Save("名前を付けて保存.bmp");//画面を名前を付けて保存
image.ReleaseDC();//CImageのデバイスコンテキストを解放。これをしないとエラーになります。

//ここまで(ソース2)

最後に

画面キャプチャソフトの作り方を.NET(C++)とMFC(C++)でみてきましたが、 .NETの場合、7行で、画面が保存できてしまいます。正直、MFCよりもかなり楽です。 ここに書いた内容が、参考になるか、反面教師になるかはわかりませんが、 お読みくださりありがとうございました。

おまけ

ATLのCImageも、.NETのImageも、 BMP,JPG,GIF,PNGのファイル形式をサポートしています。 拡張子を適宜変えるだけで、保存できてしまいます。 .NETのコードで エラーになる場合には、Form1.hのファイルの先頭を見てください。

#pragma once
の数行下に使用する名前空間が出てきますので
	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;
	using namespace System::Drawing::Drawing2D;
	using namespace System::Drawing::Imaging;
となるように書き換えてください。 不必要なものも書いてありますが、 これだけそろっていれば、エラーは吐かないと思います。

Powered by poipos.net