即时更换墙纸(200分)

  • 主题发起人 主题发起人 bq.xu
  • 开始时间 开始时间
B

bq.xu

Unregistered / Unconfirmed
GUEST, unregistred user!
我编了一个可即时更换墙纸的程序
我的程序先打开注册表
修改HKEY_CURRENT_USER/control panel/desktop/wallpaper和tilewallpaper的值
在最后调用api函数systemparametersinfo()发送消息给
windows作出响应
但在这一步总不成功
请诸位帮忙!
 
只用systemparametersinfo就行了。
如:
systemparametersinfo(SPI_SETDESKWALLPAPER ,0,pchar('d:/aaa.bmp'),SPIF_UPDATEINIFILE );
 
来自uddf

Solution 2
From: "Dirk Faber " <d.j.faber@student.utwente.nl>

Rob Wilson <wilson@pelops.compd.com> wrote
> Does anyone know how I can change the wallpaper at runtime using a
> filename that I specifiy?


--------------------------------------------------------------------------------

procedure ChangeWallpaper(bitmap: string); {bitmap contains filename: *.bmp}

var pBitmap : pchar;

begin
bitmap:=bitmap+#0;
pBitmap:=@bitmap[1];
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pBitmap, SPIF_UPDATEINIFILE);
end;


--------------------------------------------------------------------------------

> Also, is there a way of saving it to the INI file for next session?
add inifiles to the uses list.
create an inifile with a texteditor like this:
--------------------------------------------------------------------------------

[LastUsedBitmap]
LUBitmap= c:/mybitmap.bmp


--------------------------------------------------------------------------------

use a procedure like this: (supposed the inifile is like above, and is named c:/Bitmap.ini)
--------------------------------------------------------------------------------

procedure WriteToIniFile(bitmap : string);

var MyIniFile : TInifile;

begin
MyIniFile := Tinifile.Create( 'c:/Bitmap.ini' );
MyIniFile.WriteString( 'LastUsedBitmap', 'LUBitmap', bitmap);
MyIniFile.Free;
end;

procedure ReadFromIniFile(var bitmap: string);

var MyIniFile : TInifile;

begin
MyIniFile := Tinifile.Create( 'c:/Bitmap.ini' );
bitmap:= MyIniFile.ReadString('LastUsedBitmap', 'LUBitmap');
MyIniFile.Free;
end;


--------------------------------------------------------------------------------
 
控制Windows 95的壁纸,以下程序使壁纸变为我们想要的位图,如果THEPCHAR为空,那么就取消壁纸,变为Win默认色彩; 但这种方法只是暂时的,在WINDOWS重新启动后还是原来的位图,这时就需要对WIN.INI文件进行写操作,才能保存住我们改动的图片不被替换。
var THEPCHAR:pchar;
begin
THEPCHAR:='e:/a.bmp';
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, THEPCHAR, SPIF_SENDWININICHANGE)
end;
 
可以啊,
procedure TForm1.Button1Click(Sender: TObject);
var r:TRegIniFile;
begin
r:=TRegIniFile.Create('Control Panel');
r.WriteString('desktop','Wallpaper','c:/windows/clouds.bmp');
systemparametersinfo(SPI_SETDESKWALLPAPER,0,nil,SPIf_UPDATEINIFILE);
end;
 
procedureChangeIt;
 var Reg:TregIniFile;
begin
  Reg:=TRegIniFile.Create(′ControlPanel′);
  Reg.WriteString('desktop','Wallpaper','c:/pwin95/aa.bmp');
  Reg.WriteString('desktop′,'TileWallpaper','1');
  Reg.Free;
  SystemParametersInfo(SPI—SETDESKWALLPAPER,0
,nil,SPIF—SENDWININICHANGE);
end;
 
Sorry
忘了告诉大家我用的是win98
请诸位多思量!
 
98也可以,你刷新一下,看看墙纸有没有变?
 
刷新?
systemparametersinfo(SPI_SETDESKWALLPAPER,0,nil,SPIf_UPDATEINIFILE);即刷新。
 
我的系统是WINDOWS98第二般,使用上述方法:
systemparametersinfo(SPI_SETDESKWALLPAPER,0,nil,SPIf_UPDATEINIFILE);
SystemParametersInfo(SPI—SETDESKWALLPAPER,0
,nil,SPIF—SENDWININICHANGE);
SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pBitmap, SPIF_UPDATEINIFILE);

都不能实现即使更换墙纸,请各位指点迷津
 
试试:
Systemparametersinfo(SPI_SETDESKWALLPAPER,0,nil,SPIf_SendChange);

procedure TForm1.Button1Click(Sender: TObject);
var
Reg:TRegistry;
begin
Reg:=TRegistry.Create;
Reg.RootKey:=Hkey_Current_User;
Reg.OpenKey('Control Panel/Desktop',False);
Reg.WriteString('TileWallPaper','0');
Reg.WriteString('Wallpaper','c:/myPaper.bmp');
Systemparametersinfo(SPI_SETDESKWALLPAPER,0,nil,SPIf_SendChange);
Reg.CloseKey;
Reg.Free;
end;
 
好象是因为Systemparametersinfo(SPI_SETDESKWALLPAPER,0,nil,SPIf_SendChange);
总是不成功,以为Systemparametersinfo是BOOL型函数,但执行后总是返回FALSE,
不知是何原因,如何解决,请明示
 
to SuperEnergy:
刚测试了以上代码,运行良好呀!
Pwin98+D4
Systemparametersinfo返回True.
要不要将我的测试程序发给你,在你的机器上试一下。
 
第三个参数应该是bmp文件的路径
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,path+.bmp,SPIF_UPDATEINIFILE)
这样肯定可以,我作过定时更新壁纸的软件,就用了这么一句。
要注意的是path是windows所路径可以用GetWindowsDirectory得到
 
>>但执行后总是返回FALSE
请查看你的背景文件是否存在,是不是BMP格式文件,否则会返回False。
 
以下是我的原码,不知有何错误,请指教
procedure TForm1.desktop(namepath:string);
var
reg:TRegistry;


begin
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('Control Panel/desktop',false);
Reg.WriteString ('TileWallPaper','0');
reg.WriteString('Wallpaper',namepath);
reg.CloseKey;
reg.Free;


if SystemParametersInfo(SPI_SETDESKWALLPAPER,0,nil,SPIF_SENDWININICHANGE) then
begin
form1.Label1.Caption:='success';
form1.edit3.Text:='success';
end else form1.Edit3.text:='falt';
end;


上述程序可以成功的修改注册表,但需要在桌面上按一下F5(刷新)才能更换墙纸
而且WIN98可以用JPG文件做墙纸,我也是不想受BMP文件的限制,请帮帮我
 
试试这个(立刻见效):

SystemParametersInfo(SPI_SETDESKWALLPAPER,0,'c:/abc.bmp',0);
/~~~~~~~~~~~
这里不能用nil,而是图片的全文件名



beta(mophy@188.net)
 
这个问题还能玩什么花样吗?

快点结束了吧。
 
我用
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,pchar(c:/abc.bmp),SPIF_SENDWININICHANGE);
此函数返回值为‘真’,但我的桌面还是没有更新,我还需要用鼠标点击一下桌面,然后在按一下F5才能改成注册表中的墙纸。而且,我想将墙纸改成‘JPG’,但此函数中必须是BMP文件,我该怎么办?请各位指教
 
我知道了,SystemParametersInfo(SPI_SETDESKWALLPAPER,0,pchar(c:/abc.bmp),SPIF_SENDWININICHANGE);
此函数返回值为‘真’,但我的桌面还是没有更新,我还需要用鼠标点击一下桌面,然后在按一下F5才能改成注册表中的墙纸。是因为ACTIVE DESKTOP,把它关掉就行了
 
后退
顶部