Entwickler-Ecke

Multimedia / Grafik - Desktophintergrund mit Delphi ändern


strahlemann - Do 23.11.06 17:41
Titel: Desktophintergrund mit Delphi ändern
Hello,
ich würd gern mit einem Programm den Bildschirmhintergrund ändern. Einfach den Pfad eines Bildes eintippen, mit Openpicturedialog aussuchen, sonstwas --> Knöpchen drücken -->Bildschirmhintergrund geändert. Bloß wie. Wie geht das??? Wo steht drinnen, welches Bild grad Desktophintergrund spielen darf?? Wäre für Hilfe dankbar

Ach ja und bevor da jetzt die Fragen kommen, warum ich das will, und warum ich nicht einfach Rechtsklick auf den Desktop-->Desktop-->Hintergrund ändern tu, dann kann ich sagen, mein ziel ist es, ein Programm zu haben, welches, den Hintergrund auf Wahl Wöchentlich, täglich oder bei jedem booten automatisch ändert.

Danke


jasocul - Do 23.11.06 18:00

Du musst einen Eintrag in der Registry ändern:
HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper

Aber bitte nochmal prüfen. Ich bin mir nicht 100%ig sicher.


Manina - Do 23.11.06 18:36


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var s : String;
    a : Array[0..1024of Char;

...

  if OpenDlg.Execute then begin
    s := OpenDlg.FileName;
    if FileExists(s) then begin
      StrPCopy(a, s);
      SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, @a, SPIF_UPDATEINIFILE);
    end;
  end;


strahlemann - So 10.12.06 15:52

Gates nicht!
Ich habs erst jetzt ausprobiert, de facto wird der Hintergrundbildschirm blau. Weil Blau die meinige Hintergrundfarbe ist. Aber sonst tut sich dar gar nix.
Im Endeffekt will ich eigentlich ein Programm, dass unter anderem beim Hochfahren das Hintergrundbild auf die aktuelle Woche abstimmt. Das hab ich, was rauskommt steht oben.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.FormCreate(Sender: TObject);
var a : Array[0..1024of Char;
begin
  
    if FileExists('D:\Eigene Bilder\Wallpapers\'+inttostr(WeekOftheYear(Now))+'.jpg'then begin
      StrPCopy(a, 'D:\Eigene Bilder\Wallpapers\'+inttostr(WeekOftheYear(Now))+'.jpg');
      SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, @a, SPIF_UPDATEINIFILE);
    end;
end;

Ich hab auch schon bei anderen Seiten geschaut, beispielsweise bei www.ensacom.de [http://www.ensacom.de/index.php?s=sd&tid=530&kid=8&ab=su&str_query=hintergrundbild] aber da war genau das selbe Problem.


strahlemann - So 10.12.06 18:09

Gates doch!
Aber nur mit bmp und nicht mit jpg


F34r0fTh3D4rk - Fr 20.11.09 20:46

Ich bin gerade auf das selbe Problem gestoßen. Wie kann ich jegliches von Windows unterstütztes Bild-Format als Hintergrundbild zulassen?
(So als würde man im Kontext-Menü "Als Hintergrundbild verwenden" klicken)

Momentan benutze ich:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure SetWallpaperSystem(sWallpaper : String; bTile, bStrech: Boolean);
const
 aTile: Array[Boolean] of Byte =(01);
 aStrech: Array[Boolean] of Byte =(02);
begin
  with TRegIniFile.Create('Control Panel\Desktop'do try
    WriteString('''Wallpaper', sWallpaper);
    WriteInteger('''TileWallpaper', aTile[bTile]);
    WriteInteger('''WallpaperStyle', aStrech[bStrech]);
  finally Free end;

  //Aktualisiert das Hintergrundbild
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0nil, SPIF_SENDWININICHANGE);
end{Popov}

und das scheint nicht so recht zu funktionieren. Ich hab noch einen weiteren Code ausprobiert. Dieser ging allerdings überhaupt nicht.


Manfred - Fr 04.12.09 09:33

Hi,
das als Hintergrund unterstützte Bildformat lautet BMP. Sonst nichts.
Das man jpg auswählen kann liegt daran, das Windows das Bild erst konvertiert.
Erkennbar ist dies auch in der Registry im Folder
HKEY_CURRENT_USER/Control Panel/Desktop
Siehe:
- ConvertedWallpaper
- ConvertedWallpaper Last WriteTime
- OriginalWallpaper
- WallPaper
- WallpaperStyle
- TileWallpaper

Über diese Schlüssel wird vermerkt, wo das Original (sofern nicht BMP) lag (ConvertedWallpaper), wohin es konvertiert wurde (OriginalWallpaper) und wann (ConvertedWallpaper Last WriteTime).
Wurde eine BMP direkt ausgewählt, werden diese Einträge nicht berührt.
Das aktuelle Hintergrundbild (zwingend BMP) findet man im Schlüssel WallPaper.

Zudem wird festgehalten wie es dargestellt wird:
Zentriert:
- TileWallpaper = 0
- WallpaperStyle = 0
Nebeneinander:
- TileWallpaper = 1
- WallpaperStyle = 0
Gestreckt:
- TileWallpaper = 0
- WallpaperStyle = 2

Diese Infos gelten für Win XP SP3

Edit: Nachtrag
Änderungen in der Registry sind insofern unnütz, als das sich der Hintergrund erst beim nächsten Start ändern würde.
Daher besser: Finger weg.
Besser SystemParametersInfo(SPI_SETDESKWALLPAPER... verwenden


F34r0fTh3D4rk - Fr 04.12.09 19:38

Ich möchte das Hintergrundbild ohnehin nur am Start ändern. Wenn es erst beim nächsten Start passieren würde, wäre mir das also auch recht.
Man kann aber nicht irgendwie die Funktion von Windows in seinem Programm nutzen, sodass man sich nicht selber um das Konvertieren kümmern muss, oder?


FragSalat - So 06.12.09 12:35

also damit gehts in c# müsste ja das selbe in delphi sein vom syntax her

C#-Quelltext
1:
2:
[DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SystemParametersInfo(int uAction, int uParam, string lpvParam, int fuWinIni);

und dann

C#-Quelltext
1:
2:
3:
4:
5:
OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                int change = SystemParametersInfo(200, ofd.FileName, 0x1 | 0x2);
            }

sprich nen openfiledialog erzeugen und öffnen wenn das ergebnis ok ist führe SystemParametersInfo aus
mit den parametern kenn ich mich nicht so genau aus aber das lässt dich bestimmt in der msdn nachlesen


und das ändert das wallpaper direkt nicht erst beim nächsten start


mfg FragSalat

Moderiert von user profile iconNarses: C#-Tags hinzugefügt