Hintergrundbild von Win10 per Batch ändern?
Moin,
Wie kann ich einen Desktophintergrund per Batch ändern? Habe nichts gefunden dass funktioniert.
LG
2 Antworten
Mit Batch ging es früher mal über das setzen bestimmter Registryschlüssel. das geht nicht mehr, weil seit Windows 7 diverse Wallpaperfunktionen hinzgekommen sind, welch mit dem uralten Mechanismen nicht mehr funktionieren.
Höhere Sprachen wie C++,C#, Java nutzen die API-Funktion : SystemParametersInfo ...SPI_SETDESKWALLPAPER... , für batch dierekt nicht erreichbar., aber für Powershell.
setWallpaper.ps1
$PicturePath="DeinWallpaper.jpg"
#compiliere C#-Zugriff auf eine native SystemAPIFunktion (PInvoke)
#https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-systemparametersinfoa
$SPI = Add-Type -MemberDefinition '[DllImport("user32.dll")] public static extern int SystemParametersInfo (int uAction , int uParam , string lpvParam , int fuWinIni);' -Name SPI -PassThru
#SystemParametersInfo(0x14..) braucht einen absoluten Pfad!
#versuche aus einem evtl. relativen Pfad/Dateinamen einen absoluten Pfad zu kreieren.
$FullPath = (gci $PicturePath -ea Silent).FullName
$SPI::SystemParametersInfo(0x14,0,$FullPath,0) >$Null
pause
In einer Batch kann man man obiges PowerShellScript auch direkt als Kommandozeilenscript ausführen. (ich verwende im Folgenden eine Mininimalisierung)
Update: falls es gewünscht wird, auch noch die Art der Darstellung zu änden kommt man nicht umhin vor dem setzen des Bildes die Wallpaperstyles in der Registry zu setzen. (nicht zwingend erforderlich.)
setWallapaper.cmd
@echo off
rem Pfad zum Bild
set "Wallpaper=deinBild.jpg"
rem Wallpaperstyles win 10: Ausfüllen=10, Anpassen=6, Dehnen=2, Kachel=0, Zentriert=0, Strecken=22
set "WallpaperStyle=10"
rem Kachel=1 sonst 0
set "TileWallpaper=0"
rem die folgenden 2 Zeilen sind optional
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v WallPaperStyle /t REG_SZ /d "%WallpaperStyle%" /f
reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v TileWallPaper /t REG_SZ /d "%TileWallpaper%" /f
powershell "$FP=(gci '%Wallpaper%' -ea Sil).FullName;(Add-Type -m '[DllImport("""user32.dll""")] public static extern void SystemParametersInfo (int uA,int uP,string l,int fW);' -name SPI -pass)::SystemParametersInfo(0x14,0,$FP,3)"
pause
Du kannst auch ein Onlinebild verwenden:
onlineWallpaper.cmd
set "Wallpaper=einBild.jpg"
curl "https://desktopography.net/wp-content/uploads/bfi_thumb/lassedesignen_Firefox-3bj8nv6jiwpdfqrpy7s9vk.jpg" -o "%Wallpaper%" 2>nul
powershell "$FP=(gci '%Wallpaper%' -ea Sil).FullName;(Add-Type -m '[DllImport("""user32.dll""")] public static extern void SystemParametersInfo (int uA,int uP,string l,int fW);' -name SPI -pass)::SystemParametersInfo(0x14,0,$FP,0)"
pause
Batch ist für aktuelle Windows-Systeme nicht mehr zweckmäßig, da es ein Überbleibsel aus vergangenen Generationen ist, die noch auf DOS aufgesetzt haben.
Unter aktuellen Windows-Systemen verwendet man die Power-Shell.
$MyWallpaper="C:\wallpaper.jpg"
$code = @'
using System.Runtime.InteropServices;
namespace Win32{
public class Wallpaper{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
static extern int SystemParametersInfo (int uAction , int uParam , string lpvParam , int fuWinIni) ;
public static void SetWallpaper(string thePath){
SystemParametersInfo(20,0,thePath,3);
}
}
}
'@
add-type $code
[Win32.Wallpaper]::SetWallpaper($MyWallpaper)