
| 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 |