Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 Uhr.
Seite 1 von 2  1 2      

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