はじめまして。
WindowsXP VC6.0にて開発しています。
数個のアプリケーションのウィンドウをキャプチャし、
縮小しボタンに貼り付けるプログラムを作成しています。
http://www.codeproject.com/KB/graphics/screencapture.aspx
これを参考になんとかキャプチャはできたのですが、
ウィンドウの一部(全部)が隠れていたりした場合、目的外の
画像となってしまいます。
使用方法として、アプリケーションが最小化されたときに
ShowWindow( SW_HIDE )し、1秒ごとにウィンドウ状態をキャプチャし
ボタンに貼り付ける。
また、ボタンがクリックされたときに最大化するようなことがしたいの
です。
何か良き方法はないでしょうか?
ご教授願います。
質問がよくわかりません。
箇条書きにしてみてください。
わかるとこだけ回答しとくと
「デスクトップ外の部分を持つウインドウの
全体画像をクリップボード経由で取得することはできません。」
ただし、そのアプリケーションが全体画像をクリップボードに
コピーする機能を持っている場合を除く。
質問がわかり難くて申し訳ありません。
単純にウィンドウを持つアプリケーションをキャプチャしたい。
・アクティブでなくてもキャプチャする。
・アイコン化されていてもキャプチャする。
・部分的に隠れていても全てをキャプチャする。
・ShowWindow( SW_HIDE )されていてもキャプチャする。
アプリケーションがどんな状態であろうと、キャプチャをしたいのです。
よろしくお願いします。
>・アクティブでなくてもキャプチャする。
デスクトップの当該ウインドウ部分を切り取る。
方法で、できる。ルナの場合上端の角部分のトリミングが必要
>・アイコン化されていてもキャプチャする。
できない。
>・部分的に隠れていても全てをキャプチャする。
できない。隠れている部分は画像にならない。
>・ShowWindow( SW_HIDE )されていてもキャプチャする。
できない。
早速の回答、ありがとうございます。
単純にはできないから質問したのですが...
自分になりに調べてみると、
SetLayeredWindowAttributesで透明にし最前面かつ
ウィンドウ位置を(0,0)に移動させる方法でなんとか
できそうな気配です。(一瞬チラつきますが)
もっと良い方法があれば良いのですが。
>SetLayeredWindowAttributesで透明にし最前面かつ
>ウィンドウ位置を(0,0)に移動させる方法でなんとか
透明な画像(下にあるデスクトップやら別のアプリ)が
キャプチャされるだけじゃないのかな?
アイコン化、HIDE状態などであっても
「ユーザーの見える形にはしてないだけで、
どっかに完全な状態の表示内容がデータとして
OSあたりが隠し持ってるはず」
と確信して話をしてるようですが
そのような情報があったのでしょうか?
もしあれば教えてもらえますでしょうか?
それがわかれば、
それを取得するという方向で話を進めることができると思います
描画対象になってない部分は基本的に描画されませんので、
無理やりにでも描画対象にするようにしてあげるしかないわけですが、
…まぁ、世の中には、自分の状態をわざわざ(or意図的に?)保持していて、
勝手に替えると不整合になるアプリとか、
ビデオオーバレイ表示してるアプリとかもありますので、
完全解ってのは多分ないと思います。
ということで、アプリにもよるんでしょうが、
例えばBeginPaintをフックしたり
WM_PAINTを無理やり送り込んだりすれば多分、
WM_PAINTの描画処理自体で状態判断とかしていない限りは絵が取れるのでは?
# 前述のように、それでもなお取れないアプリは存在するでしょうが。
昔ちょっと遊んでみてうまく実現できなかった覚えがあるがWM_PRINT
PrintWindow手のがあるようですね
仲澤@失業者様
rin様
Ban様
wclrp ( 'o')様
返答ありがとうございます。
PrintWindow()がベストなようです。
アイコンされてしまったものは、そのままキャプチャできませんが、
アイコン化せず、ディスプレイの場外に移動させればキャプチャできる
ことが確認できましたので、その方法で進めたいと思います。
いろいろとありがとうございました。