壁紙を変更するの方法ではマルチディスプレイ環境ですべてのディスプレイに対して個別に壁紙を設定することは出来ない。 また、個別に壁紙を設定するためのレジストリエントリやAPIもないようなので、それらを使わずに壁紙を設定する方法を考える。
やり方としては、
- すべてのディスプレイに対応した大きさのビットマップを作成し
- そこにディスプレイ毎の壁紙を描画し
- その画像を一枚の壁紙として設定する
ことでディスプレイ毎に壁紙を設定したように見せることができる。
例えば、サイズが800x600のディスプレイが2つ横に並んでいる環境の場合、サイズが1600x600のビットマップを用意し、(0,0)-(800,600)に1つ目のディスプレイ用の壁紙、(800,0)-(1600,600)に2つ目のディスプレイ用の壁紙を描画することで、2つのディスプレイそれぞれに壁紙を設定したように見せることができる。
このやり方で必要となるディスプレイ毎のサイズと位置は、Screen.AllScreensプロパティに含まれる各インスタンスのScreen.Boundsプロパティを参照することで得られるが、プライマリディスプレイとその他のディスプレイの位置関係によっては、Screen.BoundsプロパティのXおよびYの値が負になる場合がある点に注意する必要がある(プライマリディスプレイの原点は常に(0, 0)となる模様)。 また、HKEY_CURRENT_USER\Control Panel\DesktopのTileWallpaperの値は1、Wallpaperstyleの値は0(つまり「並べて表示」)に設定しないと意図したとおりに表示されない。
サンプル
このコードでは、実行環境に2台のディスプレイが接続されていることを前提としている。 また、画像のアスペクト比は考慮せず、常に全体に拡大して表示する。
このコードを使ったサンプルプログラムはMultiDisplayWallpaperChangerで公開している。
SetWallpaperの詳細は壁紙を変更するを参考のこと。
以下いくつかのディスプレイ配置設定で実行した際の結果とスクリーンショット。
パターン1
プライマリディスプレイを左、2台めのディスプレイを右に配置した場合。
パターン2
プライマリディスプレイを右、2台めのディスプレイを左に配置した場合。
パターン3
プライマリディスプレイを左上、2台めのディスプレイを右下に配置した場合。
パターン4
プライマリディスプレイを左下、2台めのディスプレイを右上に配置した場合。