Вопрос
Как программно заставить Винду перерисовать обои на рабочем столе? Смысл затеи: нужно 1 раз в минуту менять WallPapper на DeskTop т.к. на нем всякая полезная информация типа информации о новостях в организации.
Ответ
Вот вам пример с сайта http://delphi.mastak.ru :
program wallpapr;
uses Registry, WinProcs;
procedure SetWallpaper(sWallpaperBMPPath : String; bTile : boolean );
var
reg : TRegIniFile;
begin
// Изменяем ключи реестра
// HKEY_CURRENT_USER
// Control Panel\Desktop
// TileWallpaper (REG_SZ)
// Wallpaper (REG_SZ)
reg := TRegIniFile.Create('Control Panel\Desktop' );
with reg do begin
WriteString( '', 'Wallpaper',
sWallpaperBMPPath );
if( bTile )then
begin
WriteString('', 'TileWallpaper', '1' );
end else begin
WriteString('', 'TileWallpaper', '0' );
end;
end;
reg.Free;
// Оповещаем всех о том, что мы
// изменили системные настройки
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, Nil, SPIF_SENDWININICHANGE);
end;
begin
// пример установки WallPaper по центру рабочего стола
SetWallpaper('c:\winnt\winnt.bmp', False );
end.
От себя добавлю: если вы изменяете один графический файл с обоями, то нет нужды писать в реестр: можете выполнить только процедуру SystemParametersInfo(…), т.к. она оповещает Windows просто перегрузить текущие обои (на мой взгляд). В любом случае, можете поэкспериментировать и найти для себя подходящее решение.
Также можете попробовать другой вариант:
str1:='D:\GRAPHICS\PICTURE\logo.bmp';
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,PChar(str1),SPIF_UPDATEINIFILE);
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,PChar(str1),SPIF_SENDWININICHANGE);
UpdateWindow(FindWindow('Progman', nil));
И вот еще проще (по идее, то же самое): как заставить винды, например, «заметить» изменения в *.BMP файле-заставке рабочего стола.
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, PChar(FileName), SPIF_UPDATEINIFILE);
Герун Данил
Copyright 2000-2004 Сообщество Чайников
Контактная информация