如何动态改变win2000的墙纸?(200分)

K

kingqc

Unregistered / Unconfirmed
GUEST, unregistred user!
我用了以下的方法好像不行
不是马上就变,得重启后才有效
控制Windows 95的壁纸,以下程序使壁纸变为我们想要的位图,如果THEPCHAR为空,那么就取消壁纸,变为Win默认色彩; 但这种方法只是暂时的,在WINDOWS重新启动后还是原来的位图,这时就需要对WIN.INI文件进行写操作,才能保存住我们改动的图片不被替换。
var THEPCHAR:pchar;
begin
THEPCHAR:='e:/a.bmp';
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, THEPCHAR, SPIF_SENDWININICHANGE)
end;

用Delphi实现壁纸更换

  在Windows95/98中,都是使用注册表对系统数据进行管理,有关壁纸的设置数据保存在Hkey_Current_User/Control Panel/Desktop的Wallpaper和TileWallpaper 等键值中,只要成功修改了这两个键值,然后发消息给Windows即可更换壁纸。在本例的程序中,使用了一个Tform;两个Tspeedbutton(Speedbutton1用于接受用户的浏览命令,Speedbutton2用于接受用户的更换壁纸命令);一个Timage(用于显示图片)。另外,还用到一组文件控件:Tfilelistbox,Tdrivecombobox,Tdirectorylistbox,用于选择图片文件,可以设置FileListBox的mask属性,筛选显示在FileListBox 中的文件类型(如只显示.bmp文件)。下面的两个程序段是实现浏览图片和更换壁纸的关键代码。
Procedure Tform1.SpeedButton1Click(Sender:Tobject);
begin
If (filelistbox1.FileName=
′′) then
{判断Filelistbox1中文件有没有被选中}
  Messagedlg(′请先选择一幅位图′,mtInformation,[mbOK],0)
else
Image1.Picture.LoadFormFile(Filelistbox1.FileName);{加载图片文件并显示}
end;
ProcedureTform1.SpeedButton2Click(Sender:TObject);
Var
Reg:Tregistry;{Tregistry 对象在Registry 单元中声明,需用Uses令引用Registry单元}
}
begin
If (Filelistbox1.FileName=′′) then
Messagedlg(′请先选择一幅位图′,mtinformation,[mbOK],0)
else
begin
Reg:=Tregistry.Create;{创建Tregistry对象的实例}
Reg.Rootkey:= Hkey_Current_User;{设置根键名称}
Reg.OpenKey′Control Panel/Desktop′,False);
{打开Control Panel/Desktop 路径对应的主键}
Reg.WriteString (′TileWallPaper′,
′0′);
Reg.WriteString
′Wallpaper′,fileli?
stbox1.FileName);{向TileWallpaper 和Wallpaper串覆盖写入新值}
Systemparametersinfo(SPI_SETDESKWallpaper,0,Nil,SPIF_SendChange);{向Windows发送消息,通知Windows更换壁纸}
Reg.CloseKey;{将更改内容写入注册表并关闭}
Reg.Free;{释放对象}
end;
end;
  代码中用到的一些函数可以察看Delphi的联机帮助。需要注意的是:调用打开子键的函数OpenKey时,第二个参数一定要设为False。
(请作者速与本报联系)
本文出自:《电脑报》1999年03月22日第11期
//////////////////////////////////////
增强的版本
uses
Registry, WinProcs, SysUtils;
const
// WallPaperStyles
WPS_Tile = 0;
WPS_Center = 1;
WPS_SizeToFit = 2;
WPS_XY = 3;
//
// sWallpaperBMPPath
// - path to a BMP file
//
// nStyle
// - any of the above WallPaperStyles
//
// nX, nY
// - if the nStyle is set to WPS_XY,
// nX and nY can be used to set the
// exact position of the wall paper
//
procedure SetWallpaperExt(
sWallpaperBMPPath : string;
nStyle,
nX, nY : integer );
var
reg : TRegIniFile;
s1 : string;
X, Y : integer;
begin
//
// change registry
//
// HKEY_CURRENT_USER/
// Control Panel/Desktop
// TileWallpaper (REG_SZ)
// Wallpaper (REG_SZ)
// WallpaperStyle (REG_SZ)
// WallpaperOriginX (REG_SZ)
// WallpaperOriginY (REG_SZ)
//
reg := TRegIniFile.Create(
'Control Panel/Desktop' );
with reg do
begin
s1 := '0';
X := 0;
Y := 0;
case nStyle of
WPS_Tile : s1 := '1';
WPS_Center: nStyle := WPS_Tile;
WPS_XY :
begin
nStyle := WPS_Tile;
X := nX;
Y := nY;
end;
end;

WriteString( '',
'Wallpaper',
sWallpaperBMPPath );
WriteString( '',
'TileWallpaper',
s1 );
WriteString( '',
'WallpaperStyle',
IntToStr( nStyle ) );
WriteString( '',
'WallpaperOriginX',
IntToStr( X ) );
WriteString( '',
'WallpaperOriginY',
IntToStr( Y ) );
end;
reg.Free;
//
// let everyone know that we
// changed a system parameter
//
SystemParametersInfo(
SPI_SETDESKWALLPAPER,
0,
Nil,
SPIF_SENDWININICHANGE );
end;


Here are two examples on how to call the above SetWallpaperExt() function.
// set wallpaper to winnt.bmp and
// stretch it to fit the screen
SetWallpaperExt(
'c:/winnt/winnt.bmp',
WPS_SizeToFit, 0, 0 );
// set the wallpaper origin
// to (10, 200)
SetWallpaperExt(
'c:/winnt/winnt.bmp',
WPS_XY, 10, 200 );

/////////////////////////////////////
永久改变
SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, 'Sample.bmp', SPIF_UPDATEINIFILE);

临时改变:
SystemParametersInfo (SPI_SETDESKWALLPAPER, 0, 'Sample.bmp',0);

那位给我一个即时改变墙纸的方法
如果我要用html做墙纸
又如何改变?
高分奉送!!!!!200分
 
Procedure ChangeWallPaper;
var
Reg:TRegIniFile;
begin
Reg:=TRegIniFile.Create('Control Panel');
if OpenPictureDialog1.Execute then
begin
Reg.Writestring('desktop','Wallpaper',OpenPictureDialog1.FileName);
Reg.WriteString('desktop','TileWallpaper','1');
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,nil,SPIF_SENDWININICHANGE);
end;
Reg.Free;
end;
 
TRegIniFile
这是个什么函数啊
只有registry,ininfile啊
没见过reginifile
请指教
 
就是一个registry,ininfile化的单元.
 
在你的Form上加一个OpenPictureDialog用来选择Bitmap墙纸文件
uses
Registry;
procedure TForm1.Button1Click(Sender: TObject);
var
Ini: TregIniFile;
res: boolean;
begin
if OpenPictureDialog1.Execute then
begin
Ini := TRegIniFile.Create('Control Panel');
Ini.WriteString('desktop', 'Wallpaper', OpenPictureDialog1.FileName);
Ini.WriteString('desktop', 'TileWallpaper', '1');
Ini.Free;
res := SystemParametersInfo(SPI_SETDESKWALLPAPER,0,nil,SPIF_SENDWININICHANGE);
end;
end;



 
to htw and robertcool:
你们的方法在win98/95下可以,在win2000下不行,
主要是不能立即改变,你可以自己试试.
有时要刷新后改变,有时重起后才改变,我觉得是函数最后的那句
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,nil,SPIF_SENDWININICHANGE);
有问题,有没有别的办法??
 
那就搞不清了,我这里没有问题win2k Server
 
留下email,我可以给你源代码!
 
我原来做了一个这样的程序,在WIN9X/XP/2000中都没有问题啊,大概原理都是一样的。
 
上述方法对BMP文件是可以的,对其他类型的图片不能立即改变。
 
顶部