ホーム | アプリケーション | Tips | ダウンロード | プログラム | コラム

CBアプリ工房


アプリケーション > 画面をキャプチャしたい [ 1 | 2 ]

画面をキャプチャしたい - 1/2

更新 : 2012/09/27

 



デスクトップをキャプチャ 完成図:デスクトップをキャプチャ

キャプチャソフトの作成について解説します。

ここではデスクトップをキャプチャするソフトを作ってみます。
PrintScreen キーを押すと画面をキャプチャすることができますが、今回はこのキー操作をエミュレートする方法を含め、Win32API を使った方法も試してみます。

キャプチャソフト作成のポイント
●VCL の Clipboard を使う
●Win32API  の keybd_even, GetWindowDC などの関数を使う
●VCL  の CopyRect メソッドの使い方
以上を理解すれば作成できます。

それでは早速作ってみましょう。



まず、新規にアプリケーションを作成します。以下のコンポーネントを配置後、Name プロパティを変えます。サイズや位置は適当でかまいません。

設計時の画面キャプチャ
コンポーネント Name 説明
TMainMenu MainMenu1 メニューをひとつ作る。
Caption="キャプチャ"

Item を二つ追加。
Name="KeyItem", Caption="エミュレート"
Name="APIItem", Caption="Win32API"
TImage Image1 AutoSize を true にします。

コンポーネントの配置が済んだら、Clipboard を使用するため、Clipbrd.hpp をソースモジュールに含めます。

最初は、キー操作をエミュレートしてデスクトップをキャプチャしてみます。
キーボードで PrintScreen キーを押すとスクリーンのスナップショットがクリップボードにコピーされます。keybd_event という API を使うと、このキー操作をエミュレートすることができます。

まず、Unit1.cpp でイベントハンドラ KeyItemClick を作成します。
流れとしては、
  (1) keybd_event でキャプチャする。
  (2) クリップボードのピクチャーを Image1 に貼り付ける。
です。

keybd_event の引数は、ヘルプを見ると、仮想キーコード、ハードウェア走査コード、機能を指定するフラグ、キーストロークに付加するデータ、となっています。
今回キャプチャしたいのは、画面全体のスナップショットですから、仮想キーコードに VK_SNAPSHOT を、 ハードウェア走査コードに 0 を指定して keybd_event を呼び出せばいいはずです。なお、第二引数は WinOS で異なりますので、ヘルプを参照してください。今回は WinXP に対応させています。

画面全体のイメージがクリップボードにコピーされるのを少し待ちます。

次にクリップボードのピクチャーを Image に貼り付けるために、Assign メソッドを実行します。Assign メソッドは、すべてのプロパティを任意の系列コンポーネントから別の系列コンポーネントにコピーしてくれます。


void __fastcall TForm1::KeyItemClick(TObject *Sender)
{
    keybd_event(VK_SNAPSHOT, 0, 0, 0); // フルスクリーン 

    //クリップボードにコピーされるのを待つ
    Sleep(500);
    Application->ProcessMessages();
    
    //Clipboardの画像をImage1へ
    Image1->Picture->Assign(Clipboard());
}

今度は別の方法でキャプチャしてみます。
流れとしては、
  (
1) GetWindowDC 関数でデバイスコンテキストを取得。
  (2) CopyRect 関数で取得したデバイスコンテキストから Image1 にイメージを転送する。
です。

ここで聞き慣れない用語が出てきました。デバイスコンテキスト、です。
デバイスコンテキストというのは、ディスプレイデバイスやプリンタデバイスなどの表示デバイスを仮想化するために導入された Windows のしくみで、グラフィックオブジェクトとそれに関連する属性、 出力に影響するグラフィックモードを定義する構造体です。

Windows アプリケーションは、特定のデバイスを意識することなく、このデバイスコンテキストに対して描画を行なうことができます。今回もそうですが、API を呼び出してウィンドウに描画する際には、最初にデバイスコンテキストへのハンドルを取得し、描画が終わったら解放する必要があります。……などと説明すると大層になって難しそうです。最初は何のことか分からないと思います(私もそうでした)。

ですから、デバイスコンテキストを取得して、処理していくというのが API を使うときの手順なんだな、ぐらいに覚えておいてください。そのうち何度もお世話になってきますので、何となく分かってくるはずです。

それともうひとつ、ハンドルという用語です(デバイスコンテキストの説明をする中でハンドルが出てきましたが、分からない用語の中で、これまた分からない用語を使われると、どんどん分からなくなってきますね)。

ハンドルは、Windows アプリケーションがファイル、メモリ、GDI などのオブジェクトをオープンすると返される数値です。ハンドルは、オブジェクトごとにシステム内でユニークな数値であることが保証されていて、オブジェクトをアクセスする際には、このハンドル値を用いることになります。

ふたつとも簡単に言うと、デバイスコンテキストは、絵を描くキャンバス、ハンドルは扱っているものの番号。「僕は今、xx番のキャンバスをいじっている」、これを Windows に連絡すると処理してくれる、ということでしょうか。とりあえずこんなところで先に行きます。

続く・・・。



[ ホーム | ページトップ | 次へ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.