使用SystemParametersInfo函数实现更改计算机桌面背景图片

Daisy

发布日期: 2018-12-30 10:36:13 浏览量: 992
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

背景

有一天,Q群里的一个群友向群里提问,怎么用编程实现更改计算机的桌面。好吧,这个功能我之前没有做过,自然也不知道该怎么回答,作为一群之主,也只能勉为其难地上网去搜索下资料,给人一个答复才行啊。

经过查询,了解到了使用 SystemParametersInfo 函数就可以实现,而且这个函数功能还是很强的,设置桌面墙纸只是其中一个功能,还能设置屏保、设置屏保时间等等,基本上计算机里大部分的设置,都会使用到 SystemParametersInfo 这个函数。

现在,我就讲解下实现原理和过程,写成文档分享给大家。

函数介绍

检索或设置系统范围参数之一的值。 此功能还可以在设置参数时更新用户配置文件。

函数声明

  1. BOOL WINAPI SystemParametersInfo(
  2. _In_ UINT uiAction,
  3. _In_ UINT uiParam,
  4. _Inout_ PVOID pvParam,
  5. _In_ UINT fWinIni
  6. );

参数

  • uiAction [in]
    要检索或设置的系统范围的参数。 可能的值组织在以下相关参数表中:

    辅助功能参数
    桌面参数
    图标参数
    输入参数
    菜单参数
    电源参数
    屏幕保护参数
    超时参数
    UI效果参数
    窗口参数

  • uiParam [in]
    使用和格式取决于要查询或设置的系统参数的参数。 有关系统范围参数的更多信息,请参阅uiAction参数。 如果没有另外指出,您必须为此参数指定零。

  • pvParam [in,out]
    使用和格式取决于要查询或设置的系统参数的参数。 有关系统范围参数的更多信息,请参阅uiAction参数。 如果没有另外指出,您必须为此参数指定NULL。 有关PVOID数据类型的信息,请参阅Windows数据类型。

  • fWinIni [in]
    如果正在设置系统参数,则指定是否要更新用户配置文件,如果是,是否将WM_SETTINGCHANGE消息广播到所有顶级窗口,以通知他们更改。

返回值

  • 如果函数成功,则返回值为非零值。
  • 如果函数失败,返回值为零。 要获取扩展错误信息,请调用GetLastError。

实现原理

由上面的 SystemParametersInfo 函数介绍可以知道,该函数除了可以可以设置桌面参数之外,还可以对图标参数、菜单参数、电源参数、屏幕保护参数等进行设置。本文主要讲解的是对桌面背景图片的更改,也就是只讲下修改桌面参数,其他功能的使用都类似。

修改桌面背景图片的关键代码是:

  1. ::SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, szPicturePath, 0)

第一个参数指定修改的参数类型 SPI_SETDESKWALLPAPER 设置桌面墙纸,第三个参数是墙纸图片的路径,注意路径要求是绝对路径,不能是相对路径。

编码实现

  1. BOOL SetDeskWallpaper(char *pszFileName)
  2. {
  3. // 路径要求 绝对路径 !!
  4. if (FALSE == ::SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pszFileName, 0))
  5. {
  6. ShowError("SystemParametersInfo");
  7. return FALSE;
  8. }
  9. return TRUE;
  10. }

程序测试

直接运行程序,桌面背景图片成功更换。

总结

墙纸图片的路径一定要是绝对路径才能设置成功,使用相对路径,会设置不成功。对于本文介绍的这种修改墙纸的方法,墙纸设置成功,重启电脑后,又会还原回去。所以,这点需要注意。

参考

参考自《Windows黑客编程技术详解》一书

上传的附件 cloud_download SystemParametersInfo_Test.7z ( 144.32kb, 4次下载 )

发送私信

离开的不会再回来,回来的不再完美

12
文章数
15
评论数
eject