壁紙チェンジャー

作成日:1999/06/15

更新日:1999/09/09


どうしたら作れるか?

久しぶりに、自分のためのプログラムを作りました。 発端は、わりと良い壁紙の画像がたくさん手に入ったこと。 気分によって時々壁紙を変更していたら、手間がかかってしようがないので 壁紙を一定時間毎に自動的に変更するプログラムを作ってしまおうと思い立ったのです。

さて、まずはじめに、どうやったらプログラムで壁紙を変更することが出来るか、 を調べます。 私の場合 MSDN(マイクロソフト・デベロッパーズ・ネットワーク) の CD が役に立ちましたが、Win32 APIのリファレンスなどを 見当をつけて探してみると良いと思います。(見てみるとわかると思いますが、 膨大な機能の数に驚くとともに、おっこんな機能もあるんだとわかって いろいろ作りたくなりますよ)

で、わかったことは"SystemParametersInfo"という API(アプリケーション・プログラム・インターフェース)を呼べば システムパラメータの状態確認や設定変更が出来ると言うこと。 さらに調べてみるとこのAPIのパラメータに"SPI_SETDESKWALLPAPER"という値と ビットマップファイルのある場所を指定してやれば壁紙を変える ことができそうです。 そのほかの機能としては、

ぐらいは欲しいと思います。

実現のめどがついたので、プログラムを作成する言語は何にしようかと考えます。 WIN32 API(プログラムからウィンドウズの機能を呼び出す仕組み)が 使える言語なら何でも良いのですが、 上記機能を満たすプログラムの作成ならVisual C++が簡単だと思われるので、 Visual C++を使うことにします。

まずは、Visual C++のウィザードで"Win32 Aplication"のスケルトンを作成します。 ウィザードに答えて行くだけで、何もしないプログラムができあがります。

ここで、コメントになっている"TODO"の部分に あらかじめ調べておいたSystemParametersInfo関数を挿入してやればOK。

    SystemParametersInfo(       // システムパラメータの設定API
        SPI_SETDESKWALLPAPER,   // 壁紙の指定機能を使用
        NULL,                   // 指定しない
        "kabegami.bmp",         // ビットマップファイルの指定
        0                      // User Profileを変更しない
        );

これであとはコンパイルすれば完成。壁紙がきちんと変わることが確認できれば 後の機能をインプリメントしていきます。プログラムを作ったことがない人は 難しく考えがちですが、この程度の物ならVisual C++などの ウィザードが勝手に作った雛形にほんの数行書き足すことで簡単に出来てしまいます。 痒いところに手が届くようにパソコンを使いたいなら、プログラムの作り方も 勉強してみてはいかがでしょう。

実際に作ってみる指針(中級編)

ここではそれほど大規模なアプリケーションではありませんので、 上記と同じくMFCを使用しないでWin32 APIを素のまま使って作成していきます。

第一段階

上に述べたままでは、壁紙はオンコーディングでコンパイルし直さないと 別の壁紙データを使うことが出来ませんので、起動時にファイルから一覧を取得して その一覧データで順番に変更していくようにします。 壁紙の一覧を取得するにはCreateFile関数でファイルをオープンし、 ReadFileで読み込んで配列に格納すればよいでしょう。 もちろんプログラムの終了時にはCloseHandleでファイルを閉じる必要があります。

第二段階

第一段階のままではプログラムがはじまってしまったら最後、 プログラム自身が終了するまで操作することが出来なくなってしまいます。 そこで、Windowsらしくメッセージループを作り、壁紙の変更は別スレッドに してしまいメッセージの処理を出来るようにしてみます。 スレッドを作成するには、CreateThread関数で作成するスレッド関数を パラメータで渡します。スレッドの終了を待つにはWaitForObject関数を使用し、 スレッドの終了はCloseHandle関数を使用します。

第三段階

さらにタスクトレイにアイコンを収納して、壁紙の変更をストップしたり プログラムの終了などの操作が出来るようにしてみましょう。 タスクトレイへの登録はNOTIFYICONDATA構造体に必要なデータをセットして Shell_NotifyIcon関数でシステムに登録します。 後はコールバック関数でウィンドウメッセージを処理してやればOK。
ソフト工房トップ

トップページ