Entwickler-Ecke

Sonstiges (Delphi) - Windows-Hintergrundbild ändern???


Killi - So 24.11.02 22:33
Titel: Windows-Hintergrundbild ändern???
DIe Überschrift sagt alles: Wie mache ich das am besten??? Windows den Pfad eines Hintergrundbildes zuweisen!?!?


bis11 - So 24.11.02 22:41

Hi,

schon mal in der Registry gesucht ? :D

Ich habe das mal für Dich erledigt :

HKEY_CURRENT_USER\Control Panel\Desktop

Einfach den Wert Wallpaper ändern.

Name : Wallpaper
Typ : REG_SZ
Wert : <<Pfad zu Deinem Hintergrundbild>>

Danach mußt Du Dich neu anmelden bei den Systemen Win200, NT4.0, XP und bei den restlichen neustarten.


Delete - So 24.11.02 22:53

Schon mal die Suche bemüht? Ode rmal in dei FAQ's geschaut? :roll:


Anonymous - Mo 25.11.02 00:37

Mußte was in der FAQ unter Sonstiges sein.


patmann2001 - Mo 25.11.02 21:10

Schau mal unter diesen beiden Links nach:
http://www.auq.de/viewtopic.php?t=3112&start=0&postdays=0&postorder=asc&highlight=wallpaper
Der ist von mir und damit sollte eigentlich alles klar sein.

cu Patmann


Killi - Sa 30.11.02 19:51

Hi!

Und wie starte ich jetzt dieses hier:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
function bild_wechsel(dateiname:STRING):BOOLEAN; 
BEGIN 
   if NOT SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Pointer (dateiname), SPIF_SENDWININICHANGE) 
    then begin 
     Result:=false; 
    end ELSE 
    BEGIN 
     Result := true; 
    END; 
end;
???
da passiert bei mir nichts bzw. es kommen ein haufen Fehler - habe versucht die Funkction zu deklarieren(bei den Procedures), aber das will er nicht - wie denn dann?


Anonymous - Sa 30.11.02 20:04

Guter Mann. Hast du nicht festgestellt, daß der Link von patmann2001 zu einem Problem von patmann2001 führt. Es gibt zig Lösungen, auch in dem Thread von patmann2001. Und welchen Code nimmst du? Den von patmann2001 den er gepostet hat und mit dem er Problemme hat. Du liest dir garnicht seine Problemstellung durch. Nein. Der erste Blick fällt auf das erste grüne Stück Code und das kopierst du in dein Programm. Und jetzt soll einer dir sagen wieso das nicht funktioniert.

(01.12. 11:01 Tino) Absatz entfernt.

Das muß man sich vorstellen: unter den ganzen Codes wählst du den Problemcode.


Killi - Sa 30.11.02 21:18

*quengel, quengel, quengel*

(01.12. 11:02 Tino) Satz entfernt.

tut mir ja leid, aber hast DU dir den Post mal genauer durchgelesen? Dann wär dir auch aufgefallen dass er nur Probleme mit dem "Namen des Bildes" und dem kacheln/strecken hatte - und nicht mit dem HintergrundWECHSEL, oder? Außerdem hab ich kein Plan wie man mit funktionen umgeht


bis11 - Sa 30.11.02 22:22

Bei Funktionen mußt Du die Werte in der Klammer mit übergeben.

Beispiel :

Quelltext
1:
2:
3:
4:
5:
6:
7:
function test1(var test:String);
begin
    // Deine Anweisungen
end;

//Aufruf der Funktion
test1('Test');


Dann kannst Du auch noch Funktionen schreiben Die Dir einen Wert zurückgeben.

Beispiel :

Quelltext
1:
2:
3:
4:
5:
6:
7:
function test2(var zahl1,zahl2:Integer):Integer
begin
   result := zahl1 + zahl2;
end;

// Aufruf der Funktion
Label1.Caption := IntToStr(test2(5,5));


Ich hoffe ich habe nichts vergessen, aber daß sollte erstmal reichen dieser kleine Crashkurs.


Delete - Sa 30.11.02 22:30


Quelltext
1:
2:
3:
4:
5:
6:
7:
function test1(var test:String); 
begin 
    // Deine Anweisungen 
end; 

//Aufruf der Funktion 
test1('Test');


Dürfte dir kein Compiler compilieren! :roll:

Wenn du auf ein Objekt der Form zu greifen mußt, dann schreib die Deklaration der Funktion in den published Abschnitt der Klasse TForm. Ansonsten reicht es, wenn du sie vor dem ersten Aufruf nach Implementation implementierst.


Anonymous - Sa 30.11.02 23:42

In der FAQ sind so wunderbare Funktionen die Fehlermeldungsfrei funktionieren. Aber nimmt er die? Nein. Er will Hintergründe wechseln, kann aber mit einer Funktion nicht umgehen. Da er also nicht mit der Funktion umgehen kann, wird er mit den Rückgabewerten auch nichts anfangen können. Also sollte er das ganz weglassen:


Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar('c:\100.bmp'), SPIF_SENDWININICHANGE)
end;


Killi - Mo 02.12.02 20:34

Danke, aber das funkzt bei mir nicht - wird zwar alles in Win.ini geshrieben, aber wie schon erwähnt nicht aktualisiert! Hab mal das hier benutzt:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TForm1.SetWallpaperSystem(sWallpaper: String; bTile, bStrech: Boolean);
var 
  Reg : TRegIniFile;
begin 
  Reg := TRegIniFile.Create('Control Panel\Desktop');
  with Reg do 
  begin 
    WriteString('', 'Wallpaper', sWallpaper); 

    if bTile then WriteString('', 'TileWallpaper', '1') 
             else WriteString('', 'TileWallpaper', '0');
    if bStrech then WriteString('', 'WallpaperStyle', '2') 
               else WriteString('', 'WallpaperStyle', '0'); 
  end; 
  Reg.Free; 

  //Aktualisiert das Hintergrundbild 
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nil, SPIF_SENDWININICHANGE); 

  Application.ProcessMessages; 
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   Wall: string;
begin
     Wall:= 'C:\0.BMP';
     SetWallpaperSystem(Wall, False, False);
end;


Anonymous - Mo 02.12.02 20:52

Killi hat folgendes geschrieben:
Danke, aber das funkzt bei mir nicht - wird zwar alles in Win.ini geshrieben, ...


Sicher funktioniert das. Wenn ich auf etwas antworte und mir nicht sicher bin, dann schreibe ich "ungeprüft" dazu. Den Code aber, den ich dir zuletzt gepostet habe, hab ich ausprobiert. Bei mir funktioniert er. Vielleicht hast du den Pfad nicht richtig angegeben.


Delete - Mo 02.12.02 22:17

Ich weiß nicht, sollte man nicht noch irgendwo den RootKey angeben? Und den Pfad habe ich auch noch nie als Create-Parameter übergeben.-


Anonymous - Di 03.12.02 06:54

Meine letzte Aussage bezog sich auf:


Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar('c:\100.bmp'), SPIF_SENDWININICHANGE) 
end;


Den hab ich getestet und er funktioniert.

Der andere Code mit der Übergabe in Reg braucht kein RootKey, da es sich um TRegIniFile handelt. TRegIniFile geht automatisch von HKEY_USER\DEFAULT aus.


ConnyCarl - Mi 04.12.02 10:29
Titel: aber nicht auf anderen rechner
doch wie sieht es bei anderen rechner aus ???
auf meinem rechner läuft die änderung des hintergrundbildes, doch nicht bei meinem freund. er hat das gleich betriebssystem wie ich.

danke für die antwort.
gruß conny


Delete - Mi 04.12.02 10:35

Stimmt der Pfad zum neuen Hintergrundbild? :roll:


Killi - Mi 04.12.02 20:36

eben - bei mir geht es eben auch nicht! Habe Delphi 4, hat das was damit zu un? Außerdem Win98 SE...


ConnyCarl - Do 05.12.02 13:56
Titel: jetzt läufts auch unter win95, win98 und winxp
das sind jedenfalls die betriebssysteme auf denen ich es ausprobieren konnte. ich arbeite auch mit delphi4, hier der code:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.UebernameClick(Sender: TObject);
var
  FileSave : String;
  Reg : TRegIniFile;
begin
  Reg := TRegIniFile.Create('Control Panel\Desktop'); 
  FileSave := 'C:\Windows\HBLosung.bmp';
  Hgbild.Picture.SaveToFile(FileSave);
  Reg.WriteString('', 'Wallpaper', FileSave);
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nil, SPIF_SENDWININICHANGE)
end;

ich hoffe es konnte dir weiter helfen, mir hats ;-)
gruß conny


Delete - Do 05.12.02 15:20

Ressourcen-Schutz. :roll:


Tino - Do 05.12.02 22:46

Luckie hat folgendes geschrieben:
Ressourcen-Schutz. :roll:

Ein tolles Thema :roll:


ConnyCarl - Di 17.12.02 10:34
Titel: grosse sorge
hallo,

ich habe eine neue grosse sorge. bei mir kann ich das hintergrundbild auf dem desktop ändern. doch bei meinem kumpel geht es nicht(der reg eintrag ist jedoch gleich gesetzt). was wir aber festgestellt haben ist, dass wenn er den rechner runterfährt und wieder hoch ist das neue bild da. woran kann das liegen ???
und noch ein anderes problem habe ich mit dem abspeichern. in meinem program gibt es eine vorschau, diese funktioniert einwandfrei. jedoch wird das bild nicht richtig gespeichert ( ist mir bis jetzt nur unter Win95 pasiert). liegt es vieleicht an der farbpalette ???

hat jemand einen rat ???

gruß conny


Delete - Di 17.12.02 10:43

Send mal nach dem Eintragen in die Registry WM_SETTINGCHANGE auf.


smiegel - Di 17.12.02 11:12

Hallo, wenn der Active-Dektop von Windows aktiviert ist, funktioniert das Beispiel mit SystemParametersInfo nicht.

Folgendes funktioniert immer:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
uses
  ComObj,  // For CreateComObject and Initialization/Finalization of COM
  ShlObj;  // For IActiveDesktop

{  The CLASS ID for ActiveDesktop is not defined in
   ShlObj, while the IID is so we define it here. }
const
  CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';


procedure ChangeWallPaper(const aBildname:String);
var wStr:PWideChar;
    aDesk:IActiveDesktop;
begin
  wStr:=AllocMem(MAX_PATH*2);
  try
    StringToWideChar(aBildName, wStr, MAX_PATH*2);
    aDesk:=CreateComObject(CLSID_ActiveDesktop) as IActiveDesktop;
    aDesk.SetWallpaper(wStr, 0);
    aDesk.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
  finally
    FreeMem(wStr);
  end; // try
end; // ChangeWallPaper


ConnyCarl - Di 17.12.02 20:40
Titel: riesen dank
super, es hat geklappt.

danke
conny