[BlueLeaf1336]> PROBLEMS> 画面キャプチャ ScreenShoot>
history | TOP |
2005/03/28:作成
2005/03/29:更新
2005/03/28 | TOP |
タイトルのとおりで、画面キャプチャを取るプログラムを作ります。普段、IrfanView(IrfanView 日本語版のページ)で「画面の取り込み」をやっているんですが、調子に乗ってメニューをつけたときに、画面からはみ出ることがあります(画面がちっさいへっぽこなプログラムしか作らないからですが...)。このとき、デスクトップ全体を取り込んで、切り取って...と非常に邪魔臭いわけです。
これを、「Ctrl+F1でキャプチャする。最全面の画面をとる。メニューも」みたいな設定にしておけば、ビシッと画面からはみ出した分も含めて取り込んで、背景のごちゃごちゃしたウィンドウなんかもピシッと切り取ってやろうじゃないかと、思っているわけです。
方法も大体想像できています。
WinSight32(C++Builder 5 についてきた、メッセージ捕まえツール)で確認すると、ちゃんとメニューの占めている領域も取得できているので、プログラムからでもできるだろう、というのが一つ目。
二つ目は、当然メインの画面の領域は取得できる。
三つ目は、リージョンを使えば、矩形と矩形の足し算が簡単。
この3ステップでビシッと取り出せるはずです。
普通のキャプチャ | TOP |
数秒前に書いた3ステップのうち、いきなり2番目ですが、一番簡単なところから攻めておきます。ホットキー(もちろん自分がアクティブでない時にも反応します)を押すことで、最全面のウィンドウ全体をキャプチャして画面に表示するプログラムです。
以前に作成したクラス(BlueLeaf1336-PROGRAM-2003_0012 ホットキーを手軽に扱うためのクラス(TCoolKey,TCoolKeys))を使っています。
ScreenShoot_01.zip(174,114bytes)
多分、気のせいだと思いますが、同じウィンドウを(他のウィンドウをアクティブにせずに)何度もキャプチャしようとしても、2回目以降反応しないようなしないような。絶対しないような。そんな気がします。
参考
メニューの領域を取得 | TOP |
次に、メニューの領域を取得します。とりあえず
ここを参考に、最全面のウィンドウの子ウィンドウ(メニューも子ウィンドウの一つ...だと思う)を取得するような感じでやってみます。ところで、メニューのクラス名は「#32768」らしいので、これを使うことにします。
いけたようです。テストに使ったプログラムですが、スクリーンショットに意味がないので載せないことにします。
ScreenShoot_02.zip(167,563bytes)
やっている内容は、タイマーで1秒おきに「メニューが表示されているかどうかを調べる」「表示されていたらリストボックスに表示する」「点滅させる」ということだけです。ちゃんとメインメニューでも、ポップアップメニューでも反応しているし、メニューの四角形を点滅させることができているようです。ただ、スタートメニューは駄目でした。残念。
それはそれとして、部品はそろったようです。ん? そういえば、メニューはシステム全体で検索しているので、最全面のウィンドウの持ち物かどうかは調べていません。...でも、普通メニューといえば最全面のウィンドウだけが表示できるような気もします。とりあえず、このまま押し切ることにします。
続く...
デスクトップを描画する | TOP |
ウィンドウからはみ出たメニューを切り取ると、当然四角形ではなくなるので、背景色を指定する必要がでてきますが、ここはぜひともデスクトップと同じ色で塗りたいと思います。
...だめやん。
リージョン復習 | TOP |
手順確認 | TOP |
やろう、と思ったんですが、どこから手をつけてよいのかわからなくなってきたので少し整理しておきます。
20050329ScreenShoot.zip(176,154bytes)
こんなんできました。このページの背景が白なので偶然うまくできてる感じがしますが、実際にはデスクトップの色で塗りたくて塗りたくして仕方がないわけです。でも、画面からはみ出したメニューをビシッと切り出しているのはかなり気持がいいですねぇ。
もうちょっと体裁を整えないと多分使わないんですが、少しだけ満足しました。今のところはキャプチャしたらそのフォルダ内に画像をぼこぼこと保存していきます。bmp形式で。なので10枚も取った日にゃえらいことになります。
EOF | TOP |