背景
有一天,Q群里的一个群友向群里提问,怎么用编程实现更改计算机的桌面。好吧,这个功能我之前没有做过,自然也不知道该怎么回答,作为一群之主,也只能勉为其难地上网去搜索下资料,给人一个答复才行啊。
经过查询,了解到了使用 SystemParametersInfo 函数就可以实现,而且这个函数功能还是很强的,设置桌面墙纸只是其中一个功能,还能设置屏保、设置屏保时间等等,基本上计算机里大部分的设置,都会使用到 SystemParametersInfo 这个函数。
现在,我就讲解下实现原理和过程,写成文档分享给大家。
函数介绍检索或设置系统范围参数之一的值。 此功能还可以在设置参数时更新用户配置文件。
函数声明
BOOL WINAPISystemParametersInfo(
_In_UINT uiAction,
_In_UINT uiParam,
_Inout_PVOID pvParam,
_In_UINT fWinIni
);
参数
uiAction [in]
要检索或设置的系统范围的参数。 可能的值组织在以下相关参数表中:
辅助功能参数
桌面参数
图标参数
输入参数
菜单参数
电源参数
屏幕保护参数
超时参数
UI效果参数
窗口参数
uiParam [in]
使用和格式取决于要查询或设置的系统参数的参数。 有关系统范围参数的更多信息,请参阅uiAction参数。 如果没有另外指出,您必须为此参数指定零。
pvParam [in,out]
使用和格式取决于要查询或设置的系统参数的参数。 有关系统范围参数的更多信息,请参阅uiAction参数。 如果没有另外指出,您必须为此参数指定NULL。 有关PVOID数据类型的信息,请参阅Windows数据类型。
fWinIni [in]
如果正在设置系统参数,则指定是否要更新用户配置文件,如果是,是否将WM_SETTINGCHANGE消息广播到所有顶级窗口,以通知他们更改。
返回值
如果函数成功,则返回值为非零值。
如果函数失败,返回值为零。 要获取扩展错误信息,请调用GetLastError。
实现原理
由上面的 SystemParametersInfo 函数介绍可以知道,该函数除了可以可以设置桌面参数之外,还可以对图标参数、菜单参数、电源参数、屏幕保护参数等进行设置。本文主要讲解的是对桌面背景图片的更改,也就是只讲下修改桌面参数,其他功能的使用都类似。
修改桌面背景图片的关键代码是:
::SystemParametersInfo(SPI_SETDESKWALLPAPER,0,szPicturePath,0)
第一个参数指定修改的参数类型 SPI_SETDESKWALLPAPER 设置桌面墙纸,第三个参数是墙纸图片的路径,注意路径要求是绝对路径,不能是相对路径。
编码实现BOOLSetDeskWallpaper(char*pszFileName)
{
// 路径要求 绝对路径 !!
if(FALSE==::SystemParametersInfo(SPI_SETDESKWALLPAPER,0,pszFileName,0))
{
ShowError("SystemParametersInfo");
returnFALSE;
}
returnTRUE;
}
程序测试
直接运行程序,桌面背景图片成功更换。
总结
墙纸图片的路径一定要是绝对路径才能设置成功,使用相对路径,会设置不成功。对于本文介绍的这种修改墙纸的方法,墙纸设置成功,重启电脑后,又会还原回去。所以,这点需要注意。
参考