Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Desktop Hintergrund ändern und aktualisieren (https://www.delphipraxis.net/45339-desktop-hintergrund-aendern-und-aktualisieren.html)

Matze 4. Mai 2005 14:08


Desktop Hintergrund ändern und aktualisieren
 
Hallo!

Bisher habe ich den Desktop mittels

Delphi-Quellcode:
InvalidateRect(0,nil,true);
aktualisiert, was eigentlich auch recht gut funktioniert.

Ändere ich ein Hintergrundbild in Windows 98 oder XP und führe diesen Code aus, dann ändert sich das Hintergrundbild sofort. Unter Windows 2000 nicht, sondern erst, wenn man sich neu anmeldet.

Wie kann man allgemein den Desktop aktualisieren?

jim_raynor 4. Mai 2005 14:28

Re: Desktop aktualisieren
 
Wenn du das Hintergrundbild über SetSystemParametersInfo (oder so ähnlich) änderst, sollte die aktualisierung automatisch geschehen.

Matze 4. Mai 2005 14:30

Re: Desktop aktualisieren
 
Genau damit ändere ich ihn, aber es geht, wie gesagt, unter Windows 2000 nicht sofort, sondern erst beim ab-/anmelden.

Delphi-Quellcode:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nil, SPIF_SENDWININICHANGE);

ReDoX 4. Mai 2005 14:54

Re: Desktop aktualisieren
 
Hi,
versuche es mal mit:
Delphi-Quellcode:
uses
  ShlObj;

procedure RefreshDesktop1;
begin
  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;
oder mit:

Delphi-Quellcode:

procedure RefreshDesktop2;
var
  hDesktop: HWND;
begin
  hDesktop := FindWindowEx(FindWindowEx(FindWindow('Progman', 'Program Manager'), 0,
    'SHELLDLL_DefView', ''), 0, 'SysListView32', '');
  PostMessage(hDesktop, WM_KEYDOWN, VK_F5, 0);
  PostMessage(hDesktop, WM_KEYUP, VK_F5, 1 shl 31);
end;
Mfg ReDoX

Matze 4. Mai 2005 15:09

Re: Desktop aktualisieren
 
Danke, doch funktionieren beide Möglichkeiteh nicht einmal unter Windows XP. :?

freak4fun 4. Mai 2005 15:11

Re: Desktop aktualisieren
 
Kann man da nicht irgendwo ein refresh reinsetzen, oder ein update?

MfG
freak

Matze 4. Mai 2005 15:13

Re: Desktop aktualisieren
 
Zitat:

Zitat von freak4fun
Kann man da nicht irgendwo ein refresh reinsetzen, oder ein update?

Was meinst du damit genau?

Delphi-Quellcode:
InvalidateRect(0,nil,true);
aktualisiert ja bei den meisten Windows Versionen den Desktop.

mumu 4. Mai 2005 15:13

Re: Desktop aktualisieren
 
Delphi-Quellcode:
function ChangeWallpaper(aFile: String): Boolean;
const
  CLSID_ActiveDesktop: TGUID = '{75048700-EF1F-11D0-9888-006097DEACF9}';
var
  hObj: IUnknown;
  ADesktop: IActiveDesktop;
  wstr: PWideChar;
begin
  hObj    := CreateComObject(CLSID_ActiveDesktop);
  ADesktop := hObj as IActiveDesktop;
  wstr := AllocMem(MAX_PATH);
  try
    StringToWideChar(aFile, wstr, MAX_PATH);
    ADesktop.SetWallpaper(wstr, 0);
    ADesktop.ApplyChanges(AD_APPLY_ALL or AD_APPLY_FORCE);
  finally
    FreeMem(wstr);
  end;
end;

Matze 4. Mai 2005 15:22

Re: Desktop Hintergrund ändern und aktualisieren
 
Danke, nur geht der Code nicht unter Win 9x, da dort kein Active Desktop unterstützt wird.

Hier der komplette Code, der geht nun unter XP auch nicht mehr, obwohl ich nichts verändert habe. :gruebel:

Delphi-Quellcode:
procedure TForm1.ChangeWallpaper(sWallPaperBMPPath: string; bTile: Boolean);
var
  reg: TRegIniFile;
begin
  reg := TRegIniFile.Create('Control Panel\Desktop');
  try
    with reg do
    begin
      WriteString('', 'Wallpaper', sWallPaperBMPPath);
      WriteString('', 'TileWallpaper', IntToStr(Ord(bTile)));
    end;
  finally
    FreeAndNil(reg);
  end;
  SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nil, SPIF_SENDWININICHANGE);

  //Desktop aktualisieren
  InvalidateRect(0,nil,true);
end;
Nachtrag: Der Code lässt das Hintergrundbild verschwinden und macht ihn einfarbig, komisch.
Nachtrag 2: Ok, das lag an einer anderen Stelle im Programm, also das geht unter XP doch. :oops: Das Problem mit der Aktualisierung unter Win 2000 besteht jedoch weiterhin

MathiasSimmack 4. Mai 2005 15:53

Re: Desktop Hintergrund ändern und aktualisieren
 
Zitat:

Zitat von Matze
Danke, nur geht der Code nicht unter Win 9x, da dort kein Active Desktop unterstützt wird.

Sagt wer? Klar gibt es den Active Desktop auch unter 9x, allerdings ist er vom IE4 abhängig, der speziell bei Windows 95 installiert sein muss. Ab Windows 98 war der IE4 standardmäßig dabei.

Matze 4. Mai 2005 16:01

Re: Desktop Hintergrund ändern und aktualisieren
 
Zitat:

Zitat von MathiasSimmack
Sagt wer? Klar gibt es den Active Desktop auch unter 9x, allerdings ist er vom IE4 abhängig, der speziell bei Windows 95 installiert sein muss. Ab Windows 98 war der IE4 standardmäßig dabei.

Achso, hmm, aber jpg-Dateien konnte ich unter Win 9x nicht verwenden. Und da Active Desktop bei manchen zu Problemen führt, möchte ich darauf verzichten und vom IE möchte ich auch nicht abhängig sein.

Matze 6. Mai 2005 08:51

Re: Desktop Hintergrund ändern und aktualisieren
 
Gibt es keine Möglichkeit, unter jedem Windows den Desktop (nicht die ListView, sondern das Canvas (?) dahinter) zu aktualisieren, damit eine Änderung des Hintergrundbildes sofort ersichtlich ist?

Matze 9. Mai 2005 18:14

Re: Desktop Hintergrund ändern und aktualisieren
 
Hat denn keiner eine Idee? :gruebel:

CalganX 24. Sep 2005 17:48

Re: Desktop Hintergrund ändern und aktualisieren
 
Hi,
*nochmal hochhol*

Ich habe genau das Gleiche Problem: Windows XP Professional merkt bei mir nicht, dass sich das Hintergrundbild verändert hat. Das Einzige, was sich ändert ist, dass ich die Standard-Hintergrundfarbe des Desktops sehe. Wenn ich mir die Eigenschaften des Desktops aber ansehe ist das Hintergrundbild dort zu sehen. :?

Den Code mit ActiveX behalte ich mal im Hinterkopf, möchte aber gerne weitestgehend auf den ActiveDesktop verzichten... :?

Chris

ManuMF 24. Sep 2005 17:58

Re: Desktop aktualisieren
 
Mit dem Code
Delphi-Quellcode:
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, nil, SPIF_SENDWININICHANGE);
habe ich auch ein Problem (unter XP): Das Bild ändert sich zwar, aber nach nem Neustart oder Ab-/Anmelden isses wieder weg! :gruebel:

Ich habe dann in meinem Projekt den Weg über die Registry genommen (denn das Programm sollte sowieso nur für mich sein :???: )


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz