Windowsには、「背景」という機能があり、「画像」や「単色」、画像を順番に表示する「スライドショー」、Microsoftが表示画像を提供する「Windowsスポットライト」などがデスクトップのバックグラウンドに表示できる。こうした機能は、「壁紙」(Wall Paper)と呼ばれることもある。
Windowsにユーザーが指定可能な背景が導入されたのは、Windows Ver.3.0のとき。ただし、当時は、メインメモリがメガバイト単位で、現在のように数メガバイトもある「写真」画像を表示できたわけではない。16色の単色や、8×8ピクセルのビットマップ画像を繰り返しして表示する程度のことしかできなかった。
フルスクリーンサイズの画像を背景として使えるようになったのは、仮想記憶が導入されたWindows 95から。後継のWindows 98では「テーマ」が導入され、背景、システムアイコン、サウンド、スクリーンセーバーをまとめて設定できるようになった。Windows XPでは、背景として著名な「草原」の画像が付属した。
Windows Vistaには、背景に動画を配置できるようになったが、負荷の高さなどから後継のWindows 8では廃止になった。Windows 8では、はじめて、マルチモニターに背景が対応し、モニターごとに背景画像を指定できるようになった。これは、いまでも有効だ。
Windows 10では、仮想デスクトップが導入され、複数のデスクトップを切り替えて利用できるようになった。当初は背景は最初のデスクトップと同じものだったが、のちに仮想デスクトップごとに背景画像を指定できるようになった。
さて、Windows 11のモニタ別の背景指定だが、GUI(設定 ⇒ 個人設定 ⇒ 背景)に画像が最大で5枚しか表示されないため、モニターが6台以上ある場合に6台目以降は、すでに使った画像を使わざるを得ない(写真01)。ただし、この制限は、設定アプリの問題で、画像の表示は5枚という部分がプログラムで固定されているため、変更ができないからだ。なお、現在値は、レジストリの「HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Wallpapers」にある「BackgroundHistoryPath0」から「BackgroundHistoryPath4」である。
-

写真01: 設定アプリの個人設定 ⇒ 背景にある最近使った画像を右クリックすると、モニタのリストが表示され、画像をモニタごとに設定できる。しかし、ここには5枚しか画像が表示されないため、6枚目以降のモニタに異なる画像を背景として設定できない
Windows自体には、5枚という制限はなく、モニタすべてに異なる画像を指定できる。そのためには、プログラムを書く必要がある。(リスト01)は、その原理を示すC#のプログラム。簡単にいうと、COMオブジェクトである「IDesktopWallpaper」インターフェースを使い、そのメソッドである「SetWallpaper」を使って、モニタごとに画像を割り当てる。モニタの枚数などの情報もIDesktopWallpaperで得られる。このインターフェースは、
IDesktopWallpaper (shobjidl_core.h) - Win32 apps | Microsoft Learn
に情報がある。
■リスト01
using System;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.UI.Shell;
var desktopWallpaper = (IDesktopWallpaper)new DesktopWallpaper();
SetWallpaper(desktopWallpaper);
static void SetWallpaper(IDesktopWallpaper desktopWallpaper) {
desktopWallpaper.SetBackgroundColor((uint)0x010101);
desktopWallpaper.SetPosition(DESKTOP_WALLPAPER_POSITION.DWPOS_CENTER);
desktopWallpaper.GetMonitorDevicePathCount(out uint monitorCount);
for (uint monitorIndex = 0; monitorIndex < monitorCount; ++monitorIndex) {
desktopWallpaper.GetMonitorDevicePathAt(monitorIndex, out PWSTR monitorIdNative);
var monitorId = monitorIdNative.ToString();
desktopWallpaper.GetMonitorRECT(monitorId, out RECT displayRect);
var wallpaperPath = @$"C:\temp\IdesktopWallpaper\img0{monitorIndex}.jpg";
desktopWallpaper.SetWallpaper(monitorId, wallpaperPath);
}
}
なお、(リスト01)のプログラムを動かすには、プロジェクトファイルなどが必要になるため、参考用にGitHubにリポジトリを作成した。dotnetコマンド(dotnet SDKに同梱)でコンパイルができるはずである。
・ShinjiShioda/IDesktopWallpaper: 窓辺の小石「Windowsの壁」サンプル
https://github.com/ShinjiShioda/IDesktopWallpaper
このプログラムを使うことで、6枚を超えるモニタに個別の画像を割り当てられるようになる。
今回のタイトルネタは、小松左京の「アメリカの壁」(徳間書店、文春文庫などに収録)である。初出は、1977年のSFマガジン7月号。アメリカの周囲に発生した白い霧の影響で、アメリカは外部との通信や交通が遮断される。このとき米国にいたジャーナリストの視点から状況を見たのが本作である。なお、小松左京は、1964年に「物体O」、1983年に映画化もされた「首都消失」を書いている。作品としては、段々とシリアスになり、最後の「首都消失」は、政治的な部分に重きが置かれた。反面、白い霧がなんなのかに関しては曖昧なまま話が終わる。その点、本作品は、白い霧の原因が明確に語られ、政治的な話は、リアリティがなく、どちらかというとオマケで終わる感じがある。
