Hintergrundbild von Win10 per Batch ändern?

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
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

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)