Bildschirmhintergrund dynamisch wechseln

Microsoft hat mit dem Bing-Desktop ein Programm erstellt, mit dem man Suchanfragen an die Bing-Suchmaschine einfach eingeben kann, ohne zuerst einen Browser zu öffnen. Da die meisten aber sowieso mit Google bzw. direkt über den Browser suchen, wird die Suchfunktion über den Bing Desktop von niemanden verwendet (den ich kenne).

Bing

Des Weiteren hat das Programm noch Funktionen wie News, Wetter und Facebook-Feed. Doch auch das nutzt niemand regelmäßig. Nachdem aber viele das Programm installiert haben, muss es ja wohl eine sinnvolle Funktion haben (außer für Microsoft, die damit eine einfache Möglichkeit der Sammlung von Daten haben).

Und diese Funktion hat es wirklich, denn es verfügt über ein nettes Gimmick, mit dem man dynamisch das Hintergrundbild vom Windows Desktop mit Bildern der Bing-Homepage anpassen kann.

Bing2

Das ist nun wiederum eine Funktion, die von vielen verwendet wird und jeden Tag einen hübschen neuen Hintergrund auf den Desktop zaubert. Doch braucht man für eine so einfache Funktion wirklich ein so mächtiges Tool.

Nach ein wenig Recherche habe ich einen anderen Weg gefunden. Die Bilder der Bing-Suche sind auf einem zentralen Repository auf http://feeds.feedburner.com/bingimages abgelegt. Von dort kann man sich die Daten des Bildes liefern lassen und in dem RSS-Feed ist auch der Link zu dem eigentlichen Bild enthalten. Nach ein wenig experimentieren mit der PowerShell habe ich folgendes Skript zusammen gebaut, das den Feed ausliest, das Bild herunterlädt und es als Bildschirmhintergrund setzt:

$file = "$env:HOMEDRIVE$env:HOMEPATH\Pictures\lockscreen_$([datetime]::Now.ToShortDateString().Replace('.','')).jpg"            
if (!(Test-Path $file)) {            
$wc = New-Object net.webclient            
[xml]$xml = $wc.DownloadString("http://feeds.feedburner.com/bingimages")            
$xmlrss = $xml.rss.channel.item | Select-Object –first 1            
$imgurl = $xmlrss.selectSingleNode('enclosure').getAttribute("url")            
$wc.DownloadFile($imgurl,$file);            
            
$SPI_SETDESKWALLPAPER = 20;            
$SPIF_UPDATEINIFILE = 0x01;            
$SPIF_SENDWININICHANGE = 0x02;            
            
$signature=@"
[DllImport("user32.dll")]
public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int flags );
"@            
$systemParamInfo = Add-Type -memberDefinition $signature -Name Wallpaper -passThru            
$systemParamInfo::SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, $file, $SPIF_UPDATEINIFILE -bor $SPIF_SENDWININICHANGE)            
}

Das funktioniert auch ganz prima, wenn man daran denkt das Skript regelmäßig neu zu starten. Um dies zu automatisieren, habe ich das Skript in den Windows Aufgabenplaner integriert. Dazu habe ich eine neue Task angelegt und darin eine neue Aufgabe angelegt.

Bing3

Die Konfiguration dieser Aufgabe ist sehr einfach. Als Programm/Skript einfach PowerShell eingeben oder die powershell.exe aus dem entsprechenden Verzeichnis auswählen (C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe). Danach bei “Argumente hinzufügen” die entsprechenden Optionen zum Ausführen des Skriptes angeben:

-executionpolicy bypass -WindowStyle hidden -file "C:\Programme\Desktop\Download_BingImage.ps1"

Im letzten Schritt dann noch die Zeitsteuerung entsprechend den persönlichen Wünschen einrichten. Hier ein Vorschlag:

Bing4

Wer nicht gerne das PowerShell-Skript auf seinem PC rumliegen haben mag, kann es natürlich auch direkt in die Task einbinden. Nach ein wenig ausprobieren, habe ich dafür auch einen weg gefunden. Dazu müsst Ihr die folgende Zeile in der neuen Aktion in das Eingabefeld “Argumente hinzufügen” einfügen:

-command "Start-Transcript c:\temp\x1.log -append -force; $file = \"$env:HOMEDRIVE$env:HOMEPATH\Pictures\lockscreen_$([datetime]::Now.ToShortDateString().Replace(‚.‘,“)).jpg\";if (!(Test-Path $file)) {    $wc =New-Object net.webclient;[xml]$xml = $wc.DownloadString(‚http://feeds.feedburner.com/bingimages‘);$xmlrss = $xml.rss.channel.item | Select-Object -first 1;$imgurl = $xmlrss.selectSingleNode(‚enclosure‘).getAttribute(‚url‘);$wc.DownloadFile($imgurl,$file);$SPI_SETDESKWALLPAPER = 20;$SPIF_UPDATEINIFILE = 0x01;$SPIF_SENDWININICHANGE = 0x02;$signature='[DllImport(\"user32.dll\")] public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int flags );‘;$systemParamInfo = Add-Type -memberDefinition $signature -Name Wallpaper -passThru; $systemParamInfo::SystemParametersInfo($SPI_SETDESKWALLPAPER, 0, $file, $SPIF_UPDATEINIFILE -bor $SPIF_SENDWININICHANGE);} Stop-Transcript; exit $LASTEXITCODE;"

Die Aufgabe kann man auch automatisch mit der PowerShell einrichten lassen. Dann sind jedoch einige Punkte zu beachten.

$c = "-command `"Start-Transcript c:\temp\x1.log -append -force;`$file = \`"`$env:HOMEDRIVE`$env:HOMEPATH"            
$c += "\Pictures\lockscreen_`$([datetime]::Now.ToShortDateString().Replace('.','')).jpg\`";"            
$c += "if (!(Test-Path `$file)) { `$wc =New-Object net.webclient;[xml]`$xml = `$wc.DownloadString('http://feeds.feedburner.com/bingimages');"            
$c += "`$xmlrss = `$xml.rss.channel.item | Select-Object -first 1;`$imgurl = `$xmlrss.selectSingleNode('enclosure').getAttribute('url');"            
$c += "`$wc.DownloadFile(`$imgurl,`$file);`$SPI_SETDESKWALLPAPER = 20;`$SPIF_UPDATEINIFILE = 0x01;`$SPIF_SENDWININICHANGE = 0x02;"            
$c += "`$signature='[DllImport(\`"user32.dll\`")] "            
$c += "public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int flags );';"            
$c += "`$systemParamInfo = Add-Type -memberDefinition `$signature -Name Wallpaper -passThru;"            
$c += "`$systemParamInfo::SystemParametersInfo(`$SPI_SETDESKWALLPAPER, 0, `$file, `$SPIF_UPDATEINIFILE -bor `$SPIF_SENDWININICHANGE);}"            
$c += " Stop-Transcript; exit `$LASTEXITCODE;"            
$A = New-ScheduledTaskAction –Execute "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -Argument $c            
$T = New-ScheduledTaskTrigger -At "9:00" -RepetitionDuration (New-TimeSpan -Day 1) -RepetitionInterval  (New-TimeSpan -Hour 1) -Once            
$S = New-ScheduledTaskSettingsSet            
$P = New-ScheduledTaskPrincipal -UserId "$Env:UserDomain\$Env:Username" -LogonType Interactive            
New-ScheduledTask -Action $A -Principal $P -Trigger $T -Settings $S -Description "Test" |             
    Register-ScheduledTask -Taskname "WallpaperChanger" -TaskPath "\SDX AG\Sylvio"

Das war es dann auch schon und einem lebendigen Hintergrund steht nichts mehr im Wege.

Advertisements
Über

Die IT-Welt wird immer komplexer und zwischen den einzelnen Komponenten gibt es immer mehr Abhängigkeiten. Nachdem ich durch meine tägliche Arbeit immer wieder vor der Herausforderung stehe, komplexe Probleme zu lösen, möchte ich diese Seite dafür verwenden, Euch den einen oder anderen Tipp zu geben, wenn Ihr vor ähnlichen Aufgabenstellungen steht.

Tagged with: ,
Veröffentlicht in PowerShell
One comment on “Bildschirmhintergrund dynamisch wechseln
  1. […] ich bereits in einem früheren Blogartikel die Verwendung von Windows Task in der PowerShell dokumentiert habe, möchte ich Euch nur noch […]

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: