• Windowsで動く壁紙

    2011年12月03日 21時19分
    PS3はXMBのテーマによっては背景が動いたりします。

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

    これ、Windowsでも同じこと出来ないのかと思ったのが今回の話。



    デスクトップの背景部分に画像を転送するAPIを見つけて
    Direct3Dのレンダリング結果を投げ込めばいいだろうと始めてみたのですが、
    そもそもデスクトップの背景を操作するようなAPIが見つからない。

    そういえばそういうソフト見たこと無いなと思って探してみたのですが、
    動画を壁紙にするソフトはあるものの、
    壁紙や背景を描画対象にするようなプログラムが見つかりません。


    近いものとしては、他のウィンドウをキャプチャするプログラムがいくつか見つかりました。
    キャプチャするバッファに対して逆に書き込みを行えば
    表示を乗っ取れるのではないかという目論見です。


    というわけで次の手順で適当なウィンドウのバッファを取ってみました。
    1. dwmapi.dllのindexが100の関数を取得
    2. 取得した関数で共有リソースのハンドルを取得
    3. ID3D10Device1.OpenSharedResourceを使って共有リソースハンドルからID3D10Resourceを取得
    4. ID3D10Resource.QueryInterfaceでID3D10Texture2Dを取得

    ソース


    このウィンドウのバッファを取ります。
    対象のウィンドウ


    BMPファイルとして保存したもの。
    キャプチャ結果

    真っ黒です。

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

    なぜか黒いしましまが入ります。
    ちなみにキャプチャ元のウィンドウに変化はありません。


    どうも根本的なことが間違っている気がしますが、さっぱりわかりません。
    dwmapiから取る関数がVista用なのかもしれません。(参考にしたソースがVista用っぽい)
    でも残念ながらVistaマシンなんてありません。


    他に少し考えたのは、DWMの内部バッファなんか無理にさわらなくても、
    ウィンドウのZ値をデスクトップのアイコンより後ろにするとか出来ないものか。など。

    あとは、描画 → ファイル保存 → 壁紙設定を高速で繰り返せば
    一応動くような気もしますが、さすがにそれば・・・


    何か良い知恵がある人は教えてください。
    ナイスな情報を教えてくれた人には何かしらお礼します。

    コメントを書く

    名前
    本文
    編集用パスワード
    管理者のみ閲覧