デスクトップ画面を背景として描画するには?

解決


柚子  2009-08-05 10:09:34  No: 70760  IP: [192.*.*.*]

質問させて頂きます

現在、自分自身を取り除いた、デスクトップ画面を描画出来るか試しています。
試しにGetDesktopWindowから、デバイスコンテキストを取得し
自分のスクリーン座標から描画したら、XPでは問題なく動作しました。
(てっきり自分自身を描画するかと思っていました)

しかし、Vista以降はやはりこの方法は使用出来ませんでした。
自分自身を描画しているのか、ウィンドウを動かしても描画内容が変わりません。

自分自身を取り除いてデスクトップ画面を描画するには
一度自分を消す必要がありますか?

ご教授の程よろしくお願いします。

編集 削除
aetos  2009-08-05 15:59:23  No: 70761  IP: [192.*.*.*]

PaintDesktop 関数を試してみるとか。

編集 削除
R  2009-08-06 00:47:29  No: 70762  IP: [192.*.*.*]

CreateCompatibleDC(NULL);でデスクトップのDCが直接取れる。

ただし描画した物を消す時は若干工夫が必要なので
そこら辺は自分で調べてみて下さい。

編集 削除
ryo  2009-08-06 01:19:30  No: 70763  IP: [192.*.*.*]

>自分自身を取り除いてデスクトップ画面を描画する
「自分自身を取り除く」ってのがよくわからない

のと

「デスクトップ画面を描画する」は、
「デスクトップ『に』、なんらかの描画をする」のではなく
「自分のウィンドウ(のあるであろう場所)に書く描画内容」が、「デスクトップ上の内容」ってことですよね

それって、デスクトップが見える「透過ウィンドウ」とは違うのかな?

編集 削除
柚子  2009-08-06 07:59:39  No: 70764  IP: [192.*.*.*]

レス有難うございます

>aetos様
今回は、デスクトップ画面でもアプリの裏に起動されているExcelといったものを描画したいと考えています
その為、PaintDesktopでは本当に〝デスクトップ”画面そのものを描画する為、本ケースでは使用できそうにありません

>R様
>CreateCompatibleDC(NULL);でデスクトップのDCが直接取れる。
これは初耳でした。GetDesktopWindowからデバイスコンテキストを取得する手間が省けますね

>ただし描画した物を消す時は若干工夫が必要なので
消す対象は、自分のアプリ自身ですので、相当手間が掛かりそうです
ShowWindowで一度自分自身を消すと、ちらつきが凄い為、この方法での実現性はなさそうです

>ryo様
>「自分自身を取り除く」ってのがよくわからない
説明不足で申し訳ありません

>「自分のウィンドウ(のあるであろう場所)に書く描画内容」が、「デスクトップ上の内容」ってことですよね
この内容と全く同じです
自分のウィンドウに下にあるであろう、デスクトップ画面を描画したいと考えています
例えば、Excel画面上に自分のウィンドウを移動したら、自分のウィンドウには下にあるExcel画面を描画します
上記例ですと、Excelのハンドルを取得すれば良い事になりますが
〝デスクトップ画面を描画”とは異なる為、使用はしません

>それって、デスクトップが見える「透過ウィンドウ」とは違うのかな?
はい、今回はあくまで自分のウィンドウの下ある、デスクトップ内容を描画したいと考えています
ウィンドウ自身を透過して、透かしてウィンドウの下にあるデスクトップ画面を表示ではありません

編集 削除
柚子  2009-08-06 08:00:51  No: 70765  IP: [192.*.*.*]

申し訳ありません、間違えて解決をチェックしてしまいました
可能であるならば、もう少しご教授を頂きたいです。
どうぞよろしくお願いします。

編集 削除
aetos  2009-08-06 09:52:48  No: 70766  IP: [192.*.*.*]

Vista 以降と以前で異なるコードになってもいいのなら、DWM を使えばそれっぽいことができる気がします。
http://msdn.microsoft.com/ja-jp/magazine/cc163435.aspx
http://msdn.microsoft.com/en-us/library/aa969540(VS.85).aspx

編集 削除
subaru  2009-08-06 21:15:51  No: 70767  IP: [192.*.*.*]

XPの場合、ウインドウをWS_EX_LAYEREDのスタイルにして
SetLayeredWindowAttributesで不透明にしておくと
デスクトップのDCからコピー(CAPTUREBLTフラグなしのBitBlt)したときに
そのウインドウが含まれない状態で描画される。

しかしこれをVistaでAeroが有効な状態で行うと
WS_EX_LAYEREDなウインドウまで含まれた状態で描画されてしまう。

・・・という話?

編集 削除
柚子  2009-08-06 22:00:31  No: 70768  IP: [192.*.*.*]

レス有難うございます

>aetos様
url迄貼り付けて頂き有難うございます
Vistaでは結構大掛かりになりそうですね…
aetos様の挙げて頂きました、DWMを少し調べて見たいと思います

>subaru様
ご指摘通りです。透過するウィンドウはWS_EX_LAYEREDスタイルを指定し
SetLayeredWindowAttributes関数で0xFFと指定し
ウィンドウ自体の透過は行っておりませんが、透過は行える状態にして
XPではデスクトップ画面を描画しておりました

>しかしこれをVistaでAeroが有効な状態で行うと
>WS_EX_LAYEREDなウインドウまで含まれた状態で描画されてしまう。
ご指摘通りです
Vista以前のOS、XPと2kでは動作しますが
Vistaでは、GetDesktopWindowから描画すると、自分自身を描画します

Vistaでも、WS_EX_LAYERED指定時、XP/2kのような動作は行えるのでしょうか?

編集 削除
wisteria  2009-08-07 08:46:26  No: 70769  IP: [192.*.*.*]

VistaではMagnification APIを使ってみてはいかがでしょう。

編集 削除
柚子  2009-08-09 08:14:01  No: 70770  IP: [192.*.*.*]

>wisteria様
レス有難うございます

>VistaではMagnification APIを使ってみてはいかがでしょう。
初耳でしたので、調べてみましたらVistaで追加されたAPIの用ですね
aetos様が挙げて頂きました、DWMを含めて利用出来るか調べてみたいと思います
有難うございました

編集 削除