C#で作成したアプリケーションで壁紙を変更することができます。そこで一定の時間が経過すると壁紙を変更するアプリをつくることにします。

壁紙を変更するクラスを定義する

壁紙を変更するためにはWindowsAPI関数を使わなければなりません。そこで壁紙を変更するクラスを定義します。

このクラスではSystemParametersInfo関数を呼び出して壁紙を変更しています。Changeメソッドは画像ファイルのパスを渡すと壁紙を変更してくれます。しかしファイルのパスが画像ファイルではないものだと問題を起こします。そこで引数として渡されたパスは画像ファイルかどうかを確認しています。Image.FromFileメソッドでImageを取得できれば画像ファイルです。そうでない場合は例外処理をおこなっています。

また空文字列を渡せば壁紙を無効にすることができます。処理が成功したらtrue、失敗したらfalseを返しています。

Form1クラスの定義

デザイナで以下のようなものを作ります。

最初に壁紙に使う画像ファイルが入ったフォルダをユーザーに選ばせます。それからこれは常駐アプリにしたいのでフォームの右上の×ボタンをクリックしてもフォームが非表示になるだけで終了しないようにします。またタスクトレイにアイコンを表示させ、非表示になったフォームを再表示させたり終了させることができるようにします。

コンストラクタの前に、コンストラクタ内で実行される処理を先に示します。

通知アイコンの初期化

InitNotifyIconメソッドは通知アイコンの初期化をおこないます。通知アイコンが使えるようにするためにはアイコンの設定、通知アイコンの可視化、通知アイコンを右クリックしたときにコンテキストメニューが表示されるようにしなければなりません。

CreateIconメソッドはNotifyIcon.IconプロパティにセットするIconを生成するためのものです。ここでは青地に「壁」という文字が書かれたアイコンを生成しています。

CreateContextMenuStripメソッドは通知アイコンを右クリックしたときに表示されるメニューを生成するためのものです。[フォームを表示する][終了する]の二つのメニューを表示させます。[フォームを表示する]がクリックされたときはthis.Visible = true;を実行し、[終了する]がクリックされたときはフィールド変数_isEnd を trueにしてアプリケーションを終了させます。_isEndがfalseのままだと終了処理を行なおうとしてもフォームが非表示になるだけだからです(この点については後述)。

InitNotifyIconメソッドはNotifyIconを初期化します。アイコンをセットしてコンテキストメニューが表示されるようにします。

プロパティの定義

次にプロパティを示します。プロパティは壁紙に使う画像ファイルがあるフォルダのパス、どれだけ時間が経過したら次の壁紙に変更するか(分・秒)を管理するためのものです。これらの値や文字列が変更された場合はLabelに変更された値と文字列を表示されるようにしています。

設定ファイルの読み込みと保存

次回、起動したときに設定を一からやり直すのは面倒なので設定が変更されたらファイルにその情報を書き込みます。ファイルの保存場所は実行ファイルがあるフォルダと同じでファイル名はconfig.xmlです。

初回起動時は設定情報が記録されたファイルが存在しないので、そのときは壁紙が切り替わる時間は5分間隔、壁紙に使う画像のフォルダは未選択ということにしておきます。

もし設定ファイルが存在する場合は、ファイルに記録されている情報を読み出して、IntervalMinutesプロパティ、IntervalSecondsプロパティ、SelectedWallPaperFolderPathプロパティに読み出したデータをセットします。

これは設定が変更されたときに、その設定をファイルに保存するメソッドです。

壁紙を変更する処理

壁紙を次々と変更していくための処理を示します。

フィールド変数_wallPaperFilePathに壁紙に使える画像ファイルのパスが格納されているので、_wallPaperFilePath.Count == 0のときは何もしない、_indexをインクリメントしながら、画像ファイルのパスが_wallPaperFilePath[_index]であるものを壁紙にしています。_index と _wallPaperFilePath.Countが同じになったら1周したことになるので_indexを0にリセットしています。

コンストラクタ

以上を前提にしてコンストラクタを示します。通知アイコンを初期化してタイマーが動作しているときはユーザーが指定した一定の間隔でChangeWallPaperメソッドを呼び出して壁紙を変更できるようにします。また設定ファイルを読み出して各プロパティにセットします。

×ボタンをクリックしても終了させない処理

ユーザーによって右上の×ボタンが押されたときの処理を示します。_isEndがfalseの場合はフォームを非表示にするだけです。_isEndがtrueの場合は通常の終了処理がおこなわれます。

壁紙に使うフォルダを設定する処理

壁紙に使える画像ファイルが保存されているフォルダを指定するときの処理を示します。

壁紙を次々と変更する処理

ShowWallPapersメソッドが呼び出されたとき、SelectedWallPaperFolderPathプロパティが空文字列のとき、またはそのようなフォルダが存在しない場合はメッセージボックスとSelectedWallPaperFolderPathプロパティを設定するための処理がおこなわれます。

SelectedWallPaperFolderPathプロパティが適切に設定されている場合は、そのフォルダのなかの画像ファイルを_tempWallPaperFolderPathで指定されたフォルダ内にコピーします。

このときに前の設定で別の画像ファイルが壁紙に使われないように_tempWallPaperFolderPathで指定されたフォルダをいったん削除して作り直す処理をおこないます。

それからデスクトップサイズよりも大きな画像を壁紙に設定すると画像がはみだしてしまい全部が表示されないので、サイズ変更をした状態でコピーします。

処理が終わったらChangeWallPaperメソッドを呼び出し、いったん停止していたタイマーをスタートさせます。これで一定間隔でChangeWallPaperメソッドが実行されるので一定間隔で壁紙を変更することができます。

壁紙変更停止と壁紙無効の処理

一定間隔で壁紙を変更する処理を停止する処理を示します。これはタイマーを停止するだけです。

設定されている壁紙を無効にする処理を示します。WallPaper.Changeメソッドに空文字列を渡せば壁紙は無効になります。

壁紙を変更する間隔を設定する処理

まず別のフォーム(Form2クラスは後述)をダイアログとして表示させてそこで時間を設定します。このダイアログがOKボタンで閉じられたらその設定をIntervalMinutesとIntervalSecondsに反映させます。そしてこれをファイルとして保存します。

Form2クラスの定義

Form2をデザイナで以下のように作ります。

numericUpDown2は秒を設定するNumericUpDownコントロールなので設定できる値は0~59です。OKボタンがクリックされたらButtonOK_Clickメソッドが実行されてダイアログが消えるようにします。

ダイアログが表示されたらIntervalMinutesとIntervalSecondsの値をNumericUpDownコントロールに反映させます。

OKボタンがクリックされたらNumericUpDown.ValueをIntervalMinutesとIntervalSecondsに代入します。このときに5秒以下の設定がされている場合は5秒になるように調整します。