【AutoIt】スポットライトの画像を表示、保存、壁紙に設定するツール

Windows のロック画面に表示される、日替わりの美しい風景写真「Windows スポットライト」。

これらの画像は魅力的ですが、PC の奥深くに、拡張子のない特殊な形式で保存されており、簡単に見つけ出して壁紙に使うことはできません。

この記事では、AutoIt を使って隠されたスポットライト画像を自動で探し出し、専用のビューアーで閲覧し、気に入ったものをデスクトップの壁紙に設定したり、好きな場所に保存したりできる、便利なツールを作成する方法を解説します。

Win11 スポットライトの画像を表示、保存、壁紙に設定するツールで紹介したツールです。

目次

完成したスクリプトの全コード

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+: GetImageWidthGetImageSizeという自作関数の中で、_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で画像をその場所にコピーします。上書き確認の機能も搭載しています。
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次