一、摘自小辉程序员之路。
二、设计思想
Windows 95/98/NT 将壁纸信息放在了注册表中的‘HKEY_CURRENT_USER\Control Panel\Desktop’目录中。与设置壁纸信息有关键值名和键值含义如下:
键值名 键值含义
Wallpaper Windows桌面背景图片的绝对路径。在Widnows98中如果启动了Active Desktop,还可以是HTML文档的绝对路径。
TileWallpaper 壁纸的显示方式(0表示居中,1表示平铺) 通过调用读取注册表的API函数,设置正确的背景图片路径,然后再调用API函数 SystemParametersInfo()向Windows发送消息,通知更换设置,即可完成背景的设置。是不是很简单呢?小辉将其功能做了一个函数,叫SetWallpaper(),其核心代码如下:
三、代码设计
void CXHDeskDlg::SetWallpaper(int WallItem)
{
// 1. 变量定义
HKEY hkRoot,hSubKey; //定义根关键字及子关键字
char itemKeyName[256]; //定义键名
char value[80]; //定义键值
long cb; //定义键值长度 char oldName[80]; //源图片文件名
char newName[80]; //存到Win目录下的文件名
char WinPath[MAX_PATH]; //Windows目录值 // 2 .读取WINDOWS目录信息,获取图片文件名
GetWindowsDirectory(WinPath,MAX_PATH);
// 2.1 确定保存到Windows下的文件名
strcpy(newName,WinPath);
strcat(newName,"\\XHDesk.bmp");
// 2.2 确定这本次设置所用的图片文件名
sprintf(oldName,"picture\\xhdesk%d.bmp",WallItem);
// 2.3 将图片copy至windows目录下
CopyFile(oldName,newName,FALSE);
strcpy(itemKeyName,"Wallpaper"); //将键名名称赋值为Wallpaper
strcpy(value,newName); //定义Wallpaper的值
cb=strlen(value); //确定长度
// 3. 打开注册表,设置Wallpaper
if(RegOpenKey(HKEY_CURRENT_USER,NULL,&hkRoot)==ERROR_SUCCESS)
{
//打开子关键字
if(RegOpenKeyEx(hkRoot,
"Control Panel\\Desktop\\",
0,
KEY_ALL_ACCESS,
&hSubKey)==ERROR_SUCCESS)
{
//设置WallPaper值
RegSetValueEx(hSubKey, (LPCTSTR)itemKeyName,
0, REG_SZ,(CONST BYTE *)value,cb);
}
else
MessageBox("设置桌面背景失败!","错误",MB_OK);
}
else
MessageBox("注册表打开错误!","错误",MB_OK); // 4. 向windows发送消息,通知windows更换Wallpaper
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,NULL,SPIF_SENDCHANGE);
// 5. 关闭注册表
RegCloseKey(hSubKey);
RegCloseKey(hkRoot);
}
注意:若运行在 Win98下,则在显示器设置的[WEB]页面设置中,应确保[按WEB页方式查看桌面]单选框没有选中。其实这个设置也可用程序控制,同样也是更改注册表的值。
二、设计思想
Windows 95/98/NT 将壁纸信息放在了注册表中的‘HKEY_CURRENT_USER\Control Panel\Desktop’目录中。与设置壁纸信息有关键值名和键值含义如下:
键值名 键值含义
Wallpaper Windows桌面背景图片的绝对路径。在Widnows98中如果启动了Active Desktop,还可以是HTML文档的绝对路径。
TileWallpaper 壁纸的显示方式(0表示居中,1表示平铺) 通过调用读取注册表的API函数,设置正确的背景图片路径,然后再调用API函数 SystemParametersInfo()向Windows发送消息,通知更换设置,即可完成背景的设置。是不是很简单呢?小辉将其功能做了一个函数,叫SetWallpaper(),其核心代码如下:
三、代码设计
void CXHDeskDlg::SetWallpaper(int WallItem)
{
// 1. 变量定义
HKEY hkRoot,hSubKey; //定义根关键字及子关键字
char itemKeyName[256]; //定义键名
char value[80]; //定义键值
long cb; //定义键值长度 char oldName[80]; //源图片文件名
char newName[80]; //存到Win目录下的文件名
char WinPath[MAX_PATH]; //Windows目录值 // 2 .读取WINDOWS目录信息,获取图片文件名
GetWindowsDirectory(WinPath,MAX_PATH);
// 2.1 确定保存到Windows下的文件名
strcpy(newName,WinPath);
strcat(newName,"\\XHDesk.bmp");
// 2.2 确定这本次设置所用的图片文件名
sprintf(oldName,"picture\\xhdesk%d.bmp",WallItem);
// 2.3 将图片copy至windows目录下
CopyFile(oldName,newName,FALSE);
strcpy(itemKeyName,"Wallpaper"); //将键名名称赋值为Wallpaper
strcpy(value,newName); //定义Wallpaper的值
cb=strlen(value); //确定长度
// 3. 打开注册表,设置Wallpaper
if(RegOpenKey(HKEY_CURRENT_USER,NULL,&hkRoot)==ERROR_SUCCESS)
{
//打开子关键字
if(RegOpenKeyEx(hkRoot,
"Control Panel\\Desktop\\",
0,
KEY_ALL_ACCESS,
&hSubKey)==ERROR_SUCCESS)
{
//设置WallPaper值
RegSetValueEx(hSubKey, (LPCTSTR)itemKeyName,
0, REG_SZ,(CONST BYTE *)value,cb);
}
else
MessageBox("设置桌面背景失败!","错误",MB_OK);
}
else
MessageBox("注册表打开错误!","错误",MB_OK); // 4. 向windows发送消息,通知windows更换Wallpaper
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,NULL,SPIF_SENDCHANGE);
// 5. 关闭注册表
RegCloseKey(hSubKey);
RegCloseKey(hkRoot);
}
注意:若运行在 Win98下,则在显示器设置的[WEB]页面设置中,应确保[按WEB页方式查看桌面]单选框没有选中。其实这个设置也可用程序控制,同样也是更改注册表的值。
Procedure Tform1.SpeedButton1Click(sender:Tobject);
Begin
If(filelistbox.FileName=")
then Messagedlg('select a photo',mtInformation,[mbOK],0)
Else
Image1,Picture.LoadFromFile(Filelistbox1.FileName);
End;
Procedure TForm.SpeedButton2Click(Sender:Tobject);
Var
Reg:Tregistry;
Begin
If (Filelistbox1.FileName=") Then
Messagedlg('Select a Photo',mtnformation,[mbOK],0)
Else
Begin
Reg:=Tregistry.Create;
Reg.Rootkey:=Hkey_Current_User;
Reg.OpenKey('Control Panel\Desktop',False);
Reg.WriteString('TileWallPaper','0');
Reg.WriteString('Wallpaper',filelistbox1.FileName);
Systemparametersinfo(SPI_SETDESKWallpaper,0,Nil,SPIF_SendChange);
Reg.CloseKey;
Reg.Free;
End;
End;
http://www.vckbase.com/sourcecode/
其中:str一个CString变量,它保存文件的名称
buf同上,是一个LPCTR变量。
WriteProfileString("Desktop","Wallpaper",str);
SystemParametersInfo(SPI_SETDESKWALLPAPER,NULL,(PVOID)buf,
SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE);