On X Windows I had a cool 'silent-alarm" reminder script that would change my root window (background) color to solid red, just for a few seconds a few moments before changing it back. Is there a way to do this for Windows XP?
I'm thinking some kind of scheduled task that uses cscript to set registry keys (HKEY_CURRENT_USER\Control Panel\Desktop) . However my attempts don't seem to have any effect. What do I have to signal to read those registry entries and re-draw the desktop?
8 Answers
This does change the background via command line. Just save this as a bat file. Use bmp or you will have to refresh. Also sets the wallpaper to be stretched. If you take out the wallpaperstyle line it will automatically be centered.
@echo off
reg add "HKCU\control panel\desktop" /v wallpaper /t REG_SZ /d "" /f
reg add "HKCU\control panel\desktop" /v wallpaper /t REG_SZ /d "C:\[LOCATION OF WALLPAPER HERE]" /f
reg delete "HKCU\Software\Microsoft\Internet Explorer\Desktop\General" /v WallpaperStyle /f
reg add "HKCU\control panel\desktop" /v WallpaperStyle /t REG_SZ /d 2 /f
RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters
exit 3 I think that once you modify the wallpaper setting in the registry, you simply need to run
RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters from the command line and the changes should take effect. You need to make sure that your image is a bmp file.
In fact, I just tried this by creating a desktop sized bmp file that was all red. I changed the //HKCU/control panel/desktop/wallpaper key to contain the full pathname to this bitmap. I ran the above command from the command line and the desktop changed to the red bmp that I just created
1Here is one option. Create a small Console App with a SharpDevelop. Put this code into Programs.cs. I call the app "CWP"; Change wallpaper. It takes just one parameter on command line: the file name. Tested on Windows 7 Ultimate 64-bit with .bmp -file.
/* * Created by SharpDevelop. * Date: 21.9.2012 * Time: 16:13 */ using System; using System.Data; using System.Text; using System.Runtime.InteropServices; namespace cwp { class Program { [DllImport("user32.dll")] public static extern Int32 SystemParametersInfo( UInt32 action, UInt32 uParam, String vParam, UInt32 winIni); public static readonly UInt32 SPI_SETDESKWALLPAPER = 0x14; public static readonly UInt32 SPIF_UPDATEINIFILE = 0x01; public static readonly UInt32 SPIF_SENDWININICHANGE = 0x02; public static void SetWallpaper(String path) { Console.WriteLine("Setting wallpaper to '" + path + "'"); SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, path, SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE); } public static void Main(string[] args) { if (args.Length >= 1) { SetWallpaper( args[0] ); } } } } this isn't as cool as actually spending time writing code, but there's a pretty useful system util called bginfo that embeds info into the desktop's background. it's fairly configurable with all sorts of command-line options. no, i didn't write it.
The registry method doesn't work all the time especially if the picture isn't in bmp format so you can try my method. It simply open the picture you want using windows photo viewer and use a keyboard shortcut to set the picture as your desktop wallpaper.
Dim wShell
set wShell = createobject("Wscript.shell")
wShell.Run "cmd /c start " & Your photo path here,0,True
do wscript.sleep 100
loop until wShell.appactivate("Windows Photo Viewer") = true
wShell.Sendkeys ("+{F10}")
WScript.Sleep 100
wShell.Sendkeys "k"
wShell.Exec "taskkill /im dllhost.exe"This is a vbs script but you can use the same method using cmd
In this time, can use python, as it says changing desktop background in windows 10 via python:
By example:
import ctypes
path = 'C:\Windows\Web\Wallpaper\Windows\img0.jpg'
ctypes.windll.user32.SystemParametersInfoW(20, 0, path, 3) For Windows 7, it works even in restricted areas!! ;) Replace your image location path with
C:\Users\1509967\Desktop\hi.jpg
reg add "HKEY_CURRENT_USER\control panel\desktop" /v wallpaper /t REG_SZ /d "" /f
reg add "HKEY_CURRENT_USER\control panel\desktop" /v wallpaper /t REG_SZ /d C:\Users\1509967\Desktop\hi.jpg /f
reg add "HKEY_CURRENT_USER\control panel\desktop" /v WallpaperStyle /t REG_SZ /d 2 /f
RUNDLL32.EXE user32.dll,UpdatePerUserSystemParameters
pause
exit No matter I tried I couldn't reliably change wallpaper with regedit and UpdatePerUserSystemParameters (even with large loops), so I ended up using powershell, it works every time.
See
Set-Wallpaper.ps1:
# use powershell.exe Set-Wallpaper.ps1 -Image "<path to image>"
param ([string]$Image="")
Function Set-WallPaper($Image) {
<#
.SYNOPSIS
Applies a specified wallpaper to the current user's desktop
.PARAMETER Image
Provide the exact path to the image
.EXAMPLE
Set-WallPaper -Image "C:\Wallpaper\Default.jpg"
#>
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class Params
{ [DllImport("User32.dll",CharSet=CharSet.Unicode)] public static extern int SystemParametersInfo (Int32 uAction, Int32 uParam, String lpvParam, Int32 fuWinIni);
}
"@
$SPI_SETDESKWALLPAPER = 0x0014
$UpdateIniFile = 0x01
$SendChangeEvent = 0x02
$fWinIni = $UpdateIniFile -bor $SendChangeEvent
$ret = [Params]::SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, $Image, $fWinIni)
}
Set-WallPaper -Image $Image 1