例えば、画像だとわかりにくいですがクロが踊ったりしてます。

これ、Windowsでも同じこと出来ないのかと思ったのが今回の話。
デスクトップの背景部分に画像を転送するAPIを見つけて
Direct3Dのレンダリング結果を投げ込めばいいだろうと始めてみたのですが、
そもそもデスクトップの背景を操作するようなAPIが見つからない。
そういえばそういうソフト見たこと無いなと思って探してみたのですが、
動画を壁紙にするソフトはあるものの、
壁紙や背景を描画対象にするようなプログラムが見つかりません。
近いものとしては、他のウィンドウをキャプチャするプログラムがいくつか見つかりました。
キャプチャするバッファに対して逆に書き込みを行えば
表示を乗っ取れるのではないかという目論見です。
というわけで次の手順で適当なウィンドウのバッファを取ってみました。
- dwmapi.dllのindexが100の関数を取得
- 取得した関数で共有リソースのハンドルを取得
- ID3D10Device1.OpenSharedResourceを使って共有リソースハンドルからID3D10Resourceを取得
- ID3D10Resource.QueryInterfaceでID3D10Texture2Dを取得
ソース
このウィンドウのバッファを取ります。

BMPファイルとして保存したもの。

真っ黒です。
でも、D3D10_TEXTURE2D_DESCはきちんと取れています。
さらに、書き込みも出来るようです。紫で塗りつぶした後キャプチャしてみました。

なぜか黒いしましまが入ります。
ちなみにキャプチャ元のウィンドウに変化はありません。
どうも根本的なことが間違っている気がしますが、さっぱりわかりません。
dwmapiから取る関数がVista用なのかもしれません。(参考にしたソースがVista用っぽい)
でも残念ながらVistaマシンなんてありません。
他に少し考えたのは、DWMの内部バッファなんか無理にさわらなくても、
ウィンドウのZ値をデスクトップのアイコンより後ろにするとか出来ないものか。など。
あとは、描画 → ファイル保存 → 壁紙設定を高速で繰り返せば
一応動くような気もしますが、さすがにそれば・・・
何か良い知恵がある人は教えてください。
ナイスな情報を教えてくれた人には何かしらお礼します。