なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ

書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

2016/12/31

Wallpaper Engine の仕組みが気になったので

カテゴリー:C#

先日、 Twitter してたら面白そうなアプリのツイートが流れてきました。

Steam で販売している”WallpaperEngine”というデスクトップの画像を動画に変更できるアプリが面白い。
設定も凄く簡単だし、最大化しているタブがある時は動画を停止してくれるので CPU に負荷もかからない。
まだアーリーだけど日本語対応予定で 400 円はお買い得。 pic.twitter.com/ihepCzT4xn

— ミースケ (@Mi_suke0108) December 27, 2016

Wallpaper Engine on Steam

どういう仕組みで背景に動画を流しているのか気になったので、
とりあえず想像でいろいろ試してみました。

で、いくつか考えたり実際に試したりしてでてきたのが、以下のもの。

  1. 不可視 Window を作成する。
  2. 1 で作成した Window にて、動画などを再生。
  3. 2 の画面をコピーし、デスクトップの Window に対して描画する。

音声などが出ている場合、 1 の Window が出している。

ということで、これを実際にやってみました。
ソースコードはこちら

仕組みとしては、WorkerW というプロセスを取得し、そいつに対して描画命令を出しています。
単純に壁紙を変えるだけならば、 SystemParametersInfo を使えばいいみたいですが、
こいつはファイルを入力にとるっぽいので、さすがに違うかなと...。

WorkerW が取得できたら、描画したいウィンドウのクライアント領域をコピーし、
WorkerW に対して送りつけています。

上記ソースの場合は、内部ブラウザーでやっていますが、
それを自由にカスタマイズしたりできるようにしたものじゃないかと考えています。

それでは。

参考: