Windows Slideshow Guide

Create an Automatic Photo Slideshow for Your Loved One

Turn any Windows computer into an automatic digital photo frame that displays family photos throughout the day. Perfect for elderly relatives who want to see family memories without touching anything.

If you already have a computer displaying Family Hub messages, you can use it for this slideshow too – no need to buy an expensive digital photo frame!

What you'll create

A slideshow that automatically starts at 10:30 AM, runs for 20 minutes, then repeats every hour until 6:30 PM. You can easily change these times to suit your needs.

Time required: 15-20 minutes

Why This is Perfect for Elderly Relatives

Research shows that viewing family photos can improve mood, reduce loneliness, and help with memory recall in older adults.

Completely Automatic

Once set up, the slideshow runs on its own. Your loved one doesn't need to touch anything or remember how to start it.

Cost Effective

Digital photo frames cost £50-200. If you already have a spare computer or monitor for Family Hub, this solution is completely free.

Regular Schedule

The slideshow runs at predictable times throughout the day, creating a pleasant routine and keeping them connected to family.

Before You Begin: Requirements

What you need:

  • Windows 11 computer – This guide is designed for Windows 11. See below for Windows 10 and Android options.
  • Your family photos – In JPG format (most phones save photos as JPG)
  • 15 minutes – To follow this guide and test everything
  • Administrator access – You'll need to run some setup scripts

Optional features:

  • Audio narration – Add MP3 or WAV files with the same name as your photos to play audio messages

Step 1: Organize Your Photos

First, create a folder and add your family photos.

Create your slideshow folder

  1. Open File Explorer (press the Windows key + E)
  2. Navigate to your C: drive
  3. Right-click in an empty area and choose New > Folder
  4. Name it Slideshow
  5. Your folder path should be: C:\Slideshow\

Add your photos

  1. Copy all your family photos into the C:\Slideshow\ folder
  2. Make sure they are JPG files (most photos from phones and cameras are)
  3. You can have as many photos as you like – they'll be shown in random order
Tip: Rename your photos to something meaningful like "Christmas2025.jpg" or "GrandkidsAtBeach.jpg" so you can find them easily later.

Optional: Add audio narration

Want a photo to play a voice message? Save an audio file (MP3 or WAV) with the exact same name as the photo.

Example:

  • Photo: C:\Slideshow\Birthday2025.jpg
  • Audio: C:\Slideshow\Birthday2025.mp3

When the photo appears, the audio will play automatically. The slideshow will wait for the audio to finish before moving to the next photo.

How to record audio: Use Windows Voice Recorder (search for "Voice Recorder" in the Start menu) or any audio recording app on your phone, then transfer the file to your computer.

Step 2: Create the Script Files

We'll create three PowerShell scripts that control the slideshow.

What are PowerShell scripts?

PowerShell scripts are simple text files that tell Windows what to do. They're safe and easy to create – just copy and paste the code below.

Where to save these files: Create a new folder called C:\SlideshowScripts\ and save all three script files there.

Script 1: Start-Slideshow.ps1

This script starts the slideshow and displays your photos fullscreen.

  1. Open Notepad (search for "Notepad" in the Start menu)
  2. Copy the code below and paste it into Notepad
  3. Click File > Save As
  4. Change "Save as type" to All Files
  5. Name the file: Start-Slideshow.ps1
  6. Save it in C:\SlideshowScripts\
IMPORTANT: After pasting the code, find line 2 where it says $folder = "C:\SlideshowPhotos20260221" and change it to $folder = "C:\Slideshow" (or whatever folder path you created in Step 1).
# Path to your slideshow folder
$folder = "C:\SlideshowPhotos20260221"

# Load necessary assemblies for GUI and Audio
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
Add-Type -AssemblyName PresentationCore

# Initialize Audio Player
$mediaPlayer = New-Object System.Windows.Media.MediaPlayer
# Set volume (0.0 to 1.0)
$mediaPlayer.Volume = 0.8

# Get all images and shuffle them randomly
Write-Host "Loading images from $folder..."
$images = Get-ChildItem -Path $folder -Filter "*.jpg" | Sort-Object { Get-Random }
$imageQueue = new-object System.Collections.Queue
$images | ForEach-Object { $imageQueue.Enqueue($_.FullName) }

if ($imageQueue.Count -eq 0) {
    Write-Host "No images found in $folder"
    Read-Host "Press Enter to exit"
    exit
}

# Create the fullscreen form
$form = New-Object System.Windows.Forms.Form
$form.Text = "Random Slideshow"
$form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::None
$form.WindowState = [System.Windows.Forms.FormWindowState]::Maximized
$form.BackColor = [System.Drawing.Color]::Black
$form.TopMost = $true

# PictureBox to display images
$pictureBox = New-Object System.Windows.Forms.PictureBox
$pictureBox.Dock = [System.Windows.Forms.DockStyle]::Fill
$pictureBox.SizeMode = [System.Windows.Forms.PictureBoxSizeMode]::Zoom
$form.Controls.Add($pictureBox)

# Function to load next image
$script:currentImage = $null

# Define Timer first so function can use it
$timer = New-Object System.Windows.Forms.Timer
$timer.Interval = 10000

function Show-NextImage {
    $timer.Stop() # Stop timer while loading/playing

    if ($imageQueue.Count -eq 0) {
        # Reshuffle if empty
        $shuffled = $images | Sort-Object { Get-Random }
        foreach ($img in $shuffled) { $imageQueue.Enqueue($img.FullName) }
    }
    
    if ($imageQueue.Count -gt 0) {
        $nextFile = $imageQueue.Dequeue()
        
        # Dispose previous image to free memory
        if ($pictureBox.Image) {
            $oldImage = $pictureBox.Image
            $pictureBox.Image = $null
            $oldImage.Dispose()
        }
        
        try {
            # Load new image
            if (Test-Path $nextFile) {
                # 1. Update Image
                $pictureBox.Image = [System.Drawing.Image]::FromFile($nextFile)

                # 2. Check for Audio
                $basePath = $nextFile.Substring(0, $nextFile.LastIndexOf('.'))
                $audioFile = $null
                if (Test-Path "$basePath.mp3") { $audioFile = "$basePath.mp3" }
                elseif (Test-Path "$basePath.wav") { $audioFile = "$basePath.wav" }

                # 3. Handle Audio/Timer Logic
                $mediaPlayer.Stop()
                
                if ($audioFile) {
                    try {
                        $mediaPlayer.Open(([Uri]$audioFile))
                        $mediaPlayer.Play()
                        
                        # We don't know duration yet (async).
                        # Strategy: Start the standard 10s timer.
                        # BUT, also hook into MediaEnded to ensure we don't cut it off if it's long.
                        # Actually, simpler: If audio exists, disable timer, wait for MediaEnded.
                        # If audio is short, we might advance too fast? 
                        # User only asked about "longer". Implicitly keeping 10s minimum is good UI.
                        
                        # Let's use a flag to track if we are waiting for audio
                        $script:waitingForAudio = $true
                        $timer.Start() 
                    } catch {
                        Write-Host "Audio Error: $_"
                        $timer.Start()
                    }
                } else {
                    $script:waitingForAudio = $false
                    $timer.Start()
                }
            }
        }
        catch {
            Write-Host "Error loading $nextFile"
            $timer.Start()
        }
    }
}

# Timer Tick Logic
$timer.Add_Tick({ 
    # If audio is playing, check if it's done or if we should keep waiting
    if ($script:waitingForAudio) {
        # Check position vs duration if possible, or just rely on events.
        # MediaPlayer doesn't easily expose "IsPlaying".
        # But we can check Position.
        if ($mediaPlayer.NaturalDuration.HasTimeSpan) {
            if ($mediaPlayer.Position -lt $mediaPlayer.NaturalDuration.TimeSpan) {
                # Audio still playing and valid, skip this tick
                return
            }
        }
    }
    Show-NextImage 
})

# Initial image
Show-NextImage

# Exit on Escape key or Click
$form.KeyPreview = $true
$form.Add_KeyDown({ 
    if ($_.KeyCode -eq [System.Windows.Forms.Keys]::Escape) { 
        $mediaPlayer.Stop()
        $timer.Stop()
        $form.Close() 
    } 
})
$pictureBox.Add_Click({ 
    $mediaPlayer.Stop()
    $timer.Stop()
    $form.Close() 
})

# Show the slideshow
Write-Host "Starting slideshow. Press ESC or click the image to exit."
[void]$form.ShowDialog()

# Cleanup
$mediaPlayer.Close()

# Cleanup
if ($pictureBox.Image) { $pictureBox.Image.Dispose() }
$form.Dispose()

What this script does:

  • Loads all JPG photos from your folder
  • Shows them fullscreen in random order
  • Changes photos every 10 seconds
  • Plays audio if an MP3/WAV file with the same name exists
  • Lets you press ESC or click to exit manually

Script 2: Stop-Slideshow.ps1

This script automatically stops the slideshow after the scheduled time.

  1. Open a new Notepad window
  2. Copy the code below and paste it into Notepad
  3. Click File > Save As
  4. Change "Save as type" to All Files
  5. Name the file: Stop-Slideshow.ps1
  6. Save it in C:\SlideshowScripts\
# Close Microsoft Photos
Get-Process "Microsoft.Photos" -ErrorAction SilentlyContinue | Stop-Process

# Close Custom PowerShell Slideshow
Get-Process | Where-Object { $_.MainWindowTitle -eq "Random Slideshow" } | Stop-Process -Force

What this script does:

  • Closes the slideshow window
  • Ensures the slideshow stops cleanly
No changes needed in this script – just save it as-is.

Script 3: Set-Slideshow-Schedule.ps1

This script creates the automatic schedule in Windows Task Scheduler.

  1. Open a new Notepad window
  2. Copy the code below and paste it into Notepad
  3. Click File > Save As
  4. Change "Save as type" to All Files
  5. Name the file: Set-Slideshow-Schedule.ps1
  6. Save it in C:\SlideshowScripts\
Customization: This script is set to start at 10:30 AM and repeat every hour until 6:30 PM, running for 20 minutes each time. You can change these times by editing lines 20-21 and 45-46 (see instructions after the code).
# Set-Slideshow-Schedule.ps1
# Creates Scheduled Tasks to run the slideshow periodically and wake the computer.

# Get the target username
$targetUser = Read-Host "Enter the username to run the slideshow for (e.g. Sadat)"
if ([string]::IsNullOrWhiteSpace($targetUser)) {
    Write-Error "Username cannot be empty."
    exit
}

# --- Configuration ---
$scriptsFolder = $PSScriptRoot
$startScript = Join-Path $scriptsFolder "Start-Slideshow.ps1"
$stopScript = Join-Path $scriptsFolder "Stop-Slideshow.ps1"

$taskNameStart = "RandomSlideshow_Start"
$taskNameStop = "RandomSlideshow_Stop"

# Schedule: 10:30 Start, repeats every hour until 18:30.
# Stop script runs 20 minutes after every start (10:50, 11:50, etc).

# --- Validation ---
if (-not (Test-Path $startScript)) { Write-Error "Start script not found: $startScript"; exit }
if (-not (Test-Path $stopScript)) { Write-Error "Stop script not found: $stopScript"; exit }

# --- Clean up existing tasks ---
Write-Host "Removing existing tasks..."
Unregister-ScheduledTask -TaskName $taskNameStart -Confirm:$false -ErrorAction SilentlyContinue
Unregister-ScheduledTask -TaskName $taskNameStop -Confirm:$false -ErrorAction SilentlyContinue

# --- Create Start Task ---
# Trigger: Daily at 10:30, repeat every 1 hour, for 8 hours (ends at 18:30 run)
$startTrigger = New-ScheduledTaskTrigger -Daily -At "10:30 AM"
$startTrigger.Repetition.Interval = New-TimeSpan -Hours 1
$startTrigger.Repetition.Duration = New-TimeSpan -Hours 8

# Action: Run PowerShell with the Start script (WindowStyle Hidden to avoid popup, but script itself creates a form)
# We use -ExecutionPolicy Bypass to ensure it runs
$startAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-WindowStyle Hidden -ExecutionPolicy Bypass -File `"$startScript`""

# Settings: Run only when user is logged on
# Removing -WakeToRun as it may require higher privileges
$startSettings = New-ScheduledTaskSettingsSet -Priority 1 -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1)

Write-Host "Registering Start Task: $taskNameStart"
# Use -Force to overwrite if exists, but we already tried to unregister.
Register-ScheduledTask -TaskName $taskNameStart -Action $startAction -Trigger $startTrigger -Settings $startSettings -Description "Starts the random slideshow at 10:30 and hourly until 18:30" -User $targetUser -Force

# --- Create Stop Task ---
# Trigger: Daily at 10:50 (20 mins after start), repeat every 1 hour, for 8 hours
$stopTrigger = New-ScheduledTaskTrigger -Daily -At "10:50 AM"
$stopTrigger.Repetition.Interval = New-TimeSpan -Hours 1
$stopTrigger.Repetition.Duration = New-TimeSpan -Hours 8

$stopAction = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-WindowStyle Hidden -ExecutionPolicy Bypass -File `"$stopScript`""
$stopSettings = New-ScheduledTaskSettingsSet -Priority 1

Write-Host "Registering Stop Task: $taskNameStop"
Register-ScheduledTask -TaskName $taskNameStop -Action $stopAction -Trigger $stopTrigger -Settings $stopSettings -Description "Stops the random slideshow 20 minutes after start" -User $targetUser -Force

Write-Host "Done! Tasks scheduled."
Write-Host "Start Task: 10:30 daily, repeats hourly until 18:30"
Write-Host "Stop Task:  10:50 daily, repeats hourly until 18:50"
pause

What this script does:

  • Asks for the Windows username (the person who's logged in)
  • Creates two scheduled tasks in Windows
  • One task starts the slideshow at 10:30 AM and every hour after (11:30, 12:30, etc.)
  • Another task stops it 20 minutes later
  • Runs automatically every day

Step 3: Run the Setup Script

Now we'll run the script to create the automatic schedule.

Open PowerShell as Administrator

  1. Click the Start button (Windows icon)
  2. Type PowerShell
  3. Right-click on Windows PowerShell
  4. Select Run as administrator
  5. Click Yes when asked for permission

Screenshot reference: Run Powershell as Administrator

Watch a video tutorial: How to open PowerShell as Administrator

Navigate to your scripts folder

In the PowerShell window, type this command and press Enter:

cd C:\SlideshowScripts

This moves PowerShell into the folder where your scripts are saved.

Allow script execution (one-time only)

Windows blocks scripts by default for security. We need to allow them. Type this command and press Enter:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Press Y and then Enter when asked to confirm.

What does this do? This tells Windows it's okay to run PowerShell scripts that you create yourself. It's safe and only affects your user account.

Run the setup script

Now type this command and press Enter:

.\Set-Slideshow-Schedule.ps1
  1. The script will ask: "Enter the username to run the slideshow for"
  2. Type your Windows username (the name you see when you log in) and press Enter
  3. Wait a few seconds while it creates the schedules
  4. You should see: "Done! Tasks scheduled."
  5. Press any key to close the script
Don't know your username? Type whoami in PowerShell and press Enter. It will show something like "COMPUTERNAME\YourUsername" – use the part after the backslash.

Step 4: Test Your Slideshow

Before waiting for the scheduled time, let's test that everything works.

Manual test

  1. Open File Explorer and go to C:\SlideshowScripts\
  2. Right-click on Start-Slideshow.ps1
  3. Select Run with PowerShell
  4. The slideshow should start fullscreen with your photos
  5. Wait a few seconds to see photos change
  6. Press ESC or click anywhere to exit
If nothing happens: Check that your photos are in the correct folder (C:\Slideshow\) and they are JPG files. Also verify you changed the folder path in the script (line 2 of Start-Slideshow.ps1).

Check the schedule in Task Scheduler

  1. Press Windows key + R
  2. Type taskschd.msc and press Enter
  3. Click on Task Scheduler Library in the left panel
  4. You should see two tasks: RandomSlideshow_Start and RandomSlideshow_Stop
  5. Click on each one to see when they will run next

Screenshot reference: [Insert screenshot of Task Scheduler showing the two slideshow tasks]

Watch a video: Windows 11 Task Scheduler basics

Customizing Your Schedule

Want to change when the slideshow runs or how long it lasts? Here's how.

Change start time, duration, or interval

Open Set-Slideshow-Schedule.ps1 in Notepad and find these lines:

To change the START TIME (currently 10:30 AM):

Find line 34:

$startTrigger = New-ScheduledTaskTrigger -Daily -At "10:30 AM"

Change "10:30 AM" to your preferred time, like "08:00 AM" or "09:15 AM"

To change the REPEAT INTERVAL (currently every 1 hour):

Find line 35:

$startTrigger.Repetition = New-ScheduledTaskTrigger -Once -At "10:30 AM" -RepetitionInterval (New-TimeSpan -Hours 1) -RepetitionDuration (New-TimeSpan -Hours 8)

Change -Hours 1 to -Hours 2 for every 2 hours, or -Minutes 30 for every 30 minutes

To change the END TIME (currently 6:30 PM, which is 8 hours after 10:30):

Same line 35: Change -RepetitionDuration (New-TimeSpan -Hours 8)

If you start at 8:00 AM and want to end at 8:00 PM, that's 12 hours, so use -Hours 12

To change the DURATION (currently 20 minutes):

Find line 52:

$stopTrigger = New-ScheduledTaskTrigger -Daily -At "10:50 AM"

The stop time is 20 minutes after start (10:30 + 20 = 10:50). Change this to your preferred duration.

Also update line 53 to match:

$stopTrigger.Repetition = New-ScheduledTaskTrigger -Once -At "10:50 AM" ...
After making changes: Save the file, then run it again in PowerShell (as Administrator) to update the schedule: .\Set-Slideshow-Schedule.ps1

Change photo duration (how long each photo shows)

Open Start-Slideshow.ps1 in Notepad and find line 43:

$timer.Interval = 10000

This is in milliseconds (1000 = 1 second). The current value of 10000 means 10 seconds per photo.

  • For 5 seconds: $timer.Interval = 5000
  • For 15 seconds: $timer.Interval = 15000
  • For 30 seconds: $timer.Interval = 30000

Save the file after making changes. The new timing will apply the next time the slideshow runs.

Examples of different schedules

Example 1: Morning and afternoon only

  • Start: 9:00 AM
  • Duration: 15 minutes (stop at 9:15 AM)
  • Repeat: Every 4 hours
  • End: 5:00 PM (8 hours duration)
  • Result: Runs at 9:00 AM, 1:00 PM, and 5:00 PM

Example 2: Frequent, short slideshows

  • Start: 8:00 AM
  • Duration: 10 minutes (stop at 8:10 AM)
  • Repeat: Every 2 hours
  • End: 8:00 PM (12 hours duration)
  • Result: Runs at 8:00, 10:00, 12:00, 2:00, 4:00, 6:00, and 8:00

Example 3: Lunch and dinner

  • Create two separate schedules using different task names
  • One at 12:00 PM for 30 minutes
  • Another at 6:00 PM for 30 minutes

Adding and Updating Photos

Your slideshow will automatically include any new photos you add to the folder.

To add new photos:

  1. Simply copy new JPG photos into C:\Slideshow\
  2. The next time the slideshow runs, they will be included automatically
  3. No need to restart anything or run scripts again

To remove photos:

  1. Delete or move photos out of C:\Slideshow\
  2. They will no longer appear in the slideshow

To update remotely:

If you set up remote access (TeamViewer, AnyDesk, Windows Remote Desktop), you can add and remove photos from anywhere, making it easy to keep the slideshow fresh with new family pictures.

Pro tip: Use a cloud storage service like OneDrive or Google Drive. Put your Slideshow folder in the cloud folder, and you can add photos from your phone or laptop anywhere in the world. They'll automatically sync to the computer.

Troubleshooting

Common issues and how to fix them.

Slideshow doesn't start automatically

  • Make sure the computer is ON and logged in at the scheduled time
  • Check Task Scheduler to verify tasks are enabled
  • Right-click each task and select "Run" to test manually

No photos appear

  • Verify photos are in the correct folder (C:\Slideshow\)
  • Make sure they are JPG files
  • Check the folder path in Start-Slideshow.ps1 line 2
  • Run the script manually to see error messages

Audio doesn't play

  • Check the audio file name exactly matches the photo name
  • Use MP3 or WAV format only
  • Make sure the computer volume is turned up
  • Test the audio file in Windows Media Player first

Slideshow doesn't stop

  • Check the Stop task is enabled in Task Scheduler
  • Manually run Stop-Slideshow.ps1
  • Press ESC or click the screen to exit

Computer goes to sleep

  • Go to Settings > System > Power & Sleep
  • Set "When plugged in, turn off after" to Never
  • Set "When plugged in, PC goes to sleep after" to Never

Script security error

  • Run PowerShell as Administrator
  • Type: Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
  • Press Y to confirm

Windows 10 and Android Options

Can you do this on older systems or tablets?

Windows 10

Good news: These exact scripts work on Windows 10 as well! The process is identical:

  • Windows 10 has PowerShell and Task Scheduler
  • Follow the same steps as the Windows 11 guide above
  • The only difference: PowerShell might look slightly different, but commands are the same
  • Opening PowerShell as Administrator is the same process
Windows 10 users: If you're using an older version (before version 1809), you may need to update Windows first. Go to Settings > Update & Security > Windows Update.

Android Tablets

Android doesn't use PowerShell or Task Scheduler, so you'll need a different approach.

Option 1: Use a slideshow app (easiest)

Download a dedicated app from the Google Play Store:

  • Photo Slideshow & Video Maker – Free, automatic scheduling
  • Fotoo - Digital Photo Frame – Designed specifically for this purpose
  • Dayframe – Can pull photos from cloud storage
  • Simple Gallery – Free and open-source with slideshow feature

Setting up scheduled slideshows on Android:

  1. Install one of the apps above
  2. Set your photo folder or connect to Google Photos
  3. Most apps have a "Scheduled Play" or "Timer" feature
  4. Configure start time, duration, and repeat interval
  5. Enable "Keep screen on" in the app settings
  6. Plug in the tablet to keep it charged

Option 2: Use Tasker (advanced users)

Tasker is an automation app (paid, about £3) that can schedule apps to open and close:

  1. Install Tasker from the Play Store
  2. Create a Task to open a gallery app at specific times
  3. Create another Task to close it after 20 minutes
  4. Set up Time triggers (10:30, 11:30, etc.)

Tasker has a learning curve, but guides are available on YouTube: Search: "Tasker schedule app Android"

Option 3: Amazon Fire Tablets

Amazon Fire tablets have a built-in "Show" mode that turns them into smart displays:

  • Go to Settings > Device Options > Show Mode
  • Enable it and configure photo albums from Amazon Photos
  • Limited scheduling options, but always-on slideshow works well

Comparison: Windows vs Android

Feature Windows (10/11) Android
Setup Complexity Medium (scripts required) Easy (apps available)
Scheduling Fully customizable Depends on app
Audio Support Yes (built-in) Some apps support it
Cost Free (if you have PC) Free - £3 for apps
Screen Size Any monitor size Tablet size (7-12")
Power Usage Higher Lower
Remote Updates Yes (Remote Desktop) Yes (cloud sync)
Our recommendation: Use Windows if you already have a computer for Family Hub. Use Android if you're buying new hardware specifically for the slideshow – tablets are cheaper and use less power.

Helpful Resources

Videos, guides, and links to help you succeed.

Need Help? Get in Touch

If you run into problems or have questions about setting up your slideshow, we're here to help.

Contact Support

Or visit our FAQ page for more Family Hub information.