Windows のロック画面に表示される、日替わりの美しい風景写真「Windows スポットライト」。
これらの画像は魅力的ですが、PC の奥深くに、拡張子のない特殊な形式で保存されており、簡単に見つけ出して壁紙に使うことはできません。
この記事では、AutoIt を使って隠されたスポットライト画像を自動で探し出し、専用のビューアーで閲覧し、気に入ったものをデスクトップの壁紙に設定したり、好きな場所に保存したりできる、便利なツールを作成する方法を解説します。
目次
完成したスクリプトの全コード
2025/08/12:Windows の仕様の変更によりスポットライト画像が表示できなくなったため、コードを編集しています。
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile_x64=スポットライトの画像を表示、保存、壁紙に設定.exe
#AutoIt3Wrapper_Res_Description=ファイルやフォルダーを追加し、開くことができます。
#AutoIt3Wrapper_Res_Fileversion=1.0.0.1
#AutoIt3Wrapper_Res_ProductName=スポットライトの画像を表示、保存、壁紙に設定
#AutoIt3Wrapper_Res_ProductVersion=1.0.0.0
#AutoIt3Wrapper_Res_CompanyName=©2025 wenbang https://windows-waza.com/
#AutoIt3Wrapper_Res_LegalCopyright=©2025 wenbang https://windows-waza.com/
#AutoIt3Wrapper_Res_LegalTradeMarks=スポットライトの画像を表示、保存、壁紙に設定.exe
#AutoIt3Wrapper_Res_Language=1041
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <Array.au3>
Global $SPI_SETDESKWALLPAPER = 20
Global $SPIF_UPDATEINIFILE = 1
Global $SPIF_SENDCHANGE = 2
$Assets = @UserProfileDir & "\AppData\Local\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets\"
$list = _FileListToArray($Assets)
If @error Then
MsgBox(262144 + 16, "", "画像ファイルが見つかりませんでした。プログラムを終了します。")
Exit
EndIf
DirRemove(@TempDir & "\Wallpaper")
DirCreate(@TempDir & "\Wallpaper")
Local $aFilesToCopy[0]
For $i = 1 To $list[0]
Local $iWidth = GetImageWidth($Assets & $list[$i])
If $iWidth > 48 Then
_ArrayAdd($aFilesToCopy, $list[$i])
EndIf
Next
If UBound($aFilesToCopy) > 0 Then
$list = $aFilesToCopy
For $i = 0 To UBound($list) - 1
FileCopy($Assets & $list[$i], @TempDir & "\Wallpaper\" & $i + 1 & ".jpg", 1)
Next
Else
MsgBox(262144 + 16, "", "画像ファイルが見つかりませんでした。プログラムを終了します。")
Exit
EndIf
Global $Num = 1
$Form1 = GUICreate("Windows Spotlight Image Viewer", 617, 437, -1, -1)
GUISetFont(9, 400, 0, "MS Pゴシック")
$Label = GUICtrlCreateLabel(GetImageSize(@TempDir & "\Wallpaper\" & $Num & ".jpg") & " | 場所:" & @TempDir & "\Wallpaper\" & $Num & ".jpg", 24, 5, 500, 15)
$Pic1 = GUICtrlCreatePic(@TempDir & "\Wallpaper\" & $Num & ".jpg", 24, 24, 569, 361)
$Button1 = GUICtrlCreateButton("←", 24, 400, 200, 25)
GUICtrlSetFont(-1, 9, 800, 0, "MS Pゴシック")
GUICtrlSetState(-1, $GUI_DISABLE)
$Button2 = GUICtrlCreateButton("→", 230, 400, 200, 25)
GUICtrlSetFont(-1, 9, 800, 0, "MS Pゴシック")
$Button3 = GUICtrlCreateButton("壁紙に設定", 440, 400, 90, 25)
$Button4 = GUICtrlCreateButton("保存", 540, 400, 55, 25)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1 ; 「前へ」ボタン
If $Num > 1 Then
$Num -= 1
_UpdateDisplay($Num)
EndIf
Case $Button2 ; 「次へ」ボタン
If $Num < UBound($list) Then
$Num += 1
_UpdateDisplay($Num)
EndIf
Case $Button3 ; 壁紙設定
Local $aResult = DllCall("user32.dll", "bool", "SystemParametersInfoW", "uint", $SPI_SETDESKWALLPAPER, "uint", 0, "wstr", @TempDir & "\Wallpaper\" & $Num & ".jpg", "uint", BitOR($SPIF_UPDATEINIFILE, $SPIF_SENDCHANGE))
If Not @error And $aResult[0] <> 0 Then
MsgBox(0, "成功", "壁紙を変更しました。")
Else
MsgBox($MB_ICONERROR, "失敗", "壁紙の変更に失敗しました。")
EndIf
Case $Button4 ; 画像の保存
Local $sDestFolder = FileSelectFolder("画像の保存先を選択", @DesktopDir, 1, "", $Form1)
If @error Then ContinueLoop
Local $sDestPath = $sDestFolder & "\" & $Num & ".jpg"
If Not FileExists($sDestPath) Then
FileCopy(@TempDir & "\Wallpaper\" & $Num & ".jpg", $sDestPath, 1)
MsgBox(0, "画像の保存", $sDestPath & " に保存しました。", 0, $Form1)
Else
If MsgBox($MB_YESNO + $MB_ICONQUESTION, "画像の保存", "ファイルが既に存在します。上書きしますか?", 0, $Form1) = $IDYES Then
FileCopy(@TempDir & "\Wallpaper\" & $Num & ".jpg", $sDestPath, 1)
MsgBox(0, "画像の保存", $sDestPath & " に上書き保存しました。", 0, $Form1)
EndIf
EndIf
EndSwitch
WEnd
Func _UpdateDisplay($iNewNum)
Local $sImagePath = @TempDir & "\Wallpaper\" & $iNewNum & ".jpg"
GUICtrlSetImage($Pic1, $sImagePath)
GUICtrlSetData($Label, GetImageSize($sImagePath) & " | 場所:" & $sImagePath)
GUICtrlSetState($Button1, ($iNewNum = 1) ? $GUI_DISABLE : $GUI_ENABLE)
GUICtrlSetState($Button2, ($iNewNum = UBound($list)) ? $GUI_DISABLE : $GUI_ENABLE)
EndFunc ;==>_UpdateDisplay
Func GetImageSize($image)
_GDIPlus_Startup()
Local $hImage = _GDIPlus_ImageLoadFromFile($image)
If @error Then Return "サイズ情報取得エラー"
Local $Width_Height = "サイズ:" & _GDIPlus_ImageGetWidth($hImage) & "×" & _GDIPlus_ImageGetHeight($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
Return $Width_Height
EndFunc ;==>GetImageSize
Func GetImageWidth($sImagePath)
_GDIPlus_Startup()
Local $hImage = _GDIPlus_ImageLoadFromFile($sImagePath)
If @error Then
_GDIPlus_Shutdown()
Return 0
EndIf
Local $iWidth = _GDIPlus_ImageGetWidth($hImage)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
Return $iWidth
EndFunc ;==>GetImageWidth
コードの詳しい解説
スポットライト画像の発見とフィルタリング
スクリプトが起動すると、まず Windows スポットライトの画像が保存されている特殊なフォルダー(Assets)にアクセスします。
_FileListToArray:Assetsフォルダー内の全てのファイルを取得します。GetImageWidth: スポットライトのフォルダーには、壁紙用の大きな画像の他に、広告用の小さなアイコン画像なども混在しています。そこで、Forループの中で各ファイルの画像の幅を GDI+ を使って調べ、幅が 48 ピクセルより大きい、壁紙に適したファイルだけをリストアップします。(この画像の形式が GUICtrlCreatePic 関数で表示することができないため)GDI+:GetImageWidthとGetImageSizeという自作関数の中で、_GDIPlus_...で始まる関数群が使われています。これは AutoIt で画像ファイルを扱うための強力なライブラリで、ファイルの拡張子がなくても画像の中身を直接読み取り、解像度などの情報を取得できます。
画像の一時コピーと準備
見つけ出した壁紙ファイルは、そのままでは扱いにくいため、一時フォルダーにコピーして準備を整えます。
DirCreate(@TempDir & "\Wallpaper"): スクリプト専用の一時フォルダーを作成します。FileCopy(...): フィルタリングで選び出した壁紙ファイルを、この一時フォルダーにコピーします。その際、1.jpg,2.jpgのように、連番と.jpg拡張子を付けた分かりやすい名前に変更します。これにより、GUI で画像として表示できるようになります。
GUIの作成と画像のナビゲーション
ユーザーが画像を閲覧するためのウィンドウを作成します。
GUICreate: メインウィンドウを作成します。GUICtrlCreatePic: 画像を表示するためのコントロールです。最初に1.jpgを表示します。_UpdateDisplay関数: 「←」「→」ボタンが押されたときに呼び出される、画面更新の専門関数です。表示する画像の番号を受け取り、GUICtrlSetImageで表示を切り替え、GUICtrlSetDataでラベルの情報を更新し、GUICtrlSetStateでボタンの有効/無効(最初の画像なら「←」を無効にするなど)を適切に管理します。この関数に処理をまとめることで、コードが非常に整理されています。
主要な機能
- 壁紙に設定: 「壁紙に設定」ボタンが押されると、
DllCallを使って Windows API を直接呼び出し、現在表示している画像をデスクトップの壁紙に設定します。 - 画像の保存: 「保存」ボタンが押されると、
FileSelectFolderで保存先のフォルダーをユーザーに選ばせ、FileCopyで画像をその場所にコピーします。上書き確認の機能も搭載しています。
コメント