一、摘自小辉程序员之路。
二、设计思想
 
  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页方式查看桌面]单选框没有选中。其实这个设置也可用程序控制,同样也是更改注册表的值。 

解决方案 »

  1.   

    (以下代码仅供参考,在Delphi5中测试成功)
    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;
      

  2.   

    忘了说了,欢迎共同探讨。[email protected]
      

  3.   

    这里有个例程序,你看看吧.
      http://www.vckbase.com/sourcecode/
      

  4.   

    你可以用下面的代码试一试:
    其中:str一个CString变量,它保存文件的名称
         buf同上,是一个LPCTR变量。
    WriteProfileString("Desktop","Wallpaper",str);
    SystemParametersInfo(SPI_SETDESKWALLPAPER,NULL,(PVOID)buf,
    SPIF_UPDATEINIFILE|SPIF_SENDWININICHANGE);
      

  5.   

    ::SystemParametersInfo(SPI_SETDESKWALL, 0, _T("xxx.bmp"), SPIF_UPDATEINIFILE);