Daisy的文章

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

    背景有一天,Q群里的一个群友向群里提问,怎么用编程实现更改计算机的桌面。好吧,这个功能我之前没有做过,自然也不知道该怎么回答,作为一群之主,也只能勉为其难地上网去搜索下资料,给人一个答复才行啊。
    经过查询,了解到了使用 SystemParametersInfo 函数就可以实现,而且这个函数功能还是很强的,设置桌面墙纸只是其中一个功能,还能设置屏保、设置屏保时间等等,基本上计算机里大部分的设置,都会使用到 SystemParametersInfo 这个函数。
    现在,我就讲解下实现原理和过程,写成文档分享给大家。
    函数介绍
    检索或设置系统范围参数之一的值。 此功能还可以在设置参数时更新用户配置文件。
    函数声明
    BOOL WINAPI SystemParametersInfo( _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 设置桌面墙纸,第三个参数是墙纸图片的路径,注意路径要求是绝对路径,不能是相对路径。
    编码实现BOOL SetDeskWallpaper(char *pszFileName){ // 路径要求 绝对路径 !! if (FALSE == ::SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pszFileName, 0)) { ShowError("SystemParametersInfo"); return FALSE; } return TRUE;}
    程序测试直接运行程序,桌面背景图片成功更换。
    总结墙纸图片的路径一定要是绝对路径才能设置成功,使用相对路径,会设置不成功。对于本文介绍的这种修改墙纸的方法,墙纸设置成功,重启电脑后,又会还原回去。所以,这点需要注意。
    参考参考自《Windows黑客编程技术详解》一书
    1  留言 2018-12-30 10:36:13
  • 使用SystemParametersInfo函数实现更改计算机桌面背景图片

    背景有一天,Q群里的一个群友向群里提问,怎么用编程实现更改计算机的桌面。好吧,这个功能我之前没有做过,自然也不知道该怎么回答,作为一群之主,也只能勉为其难地上网去搜索下资料,给人一个答复才行啊。
    经过查询,了解到了使用 SystemParametersInfo 函数就可以实现,而且这个函数功能还是很强的,设置桌面墙纸只是其中一个功能,还能设置屏保、设置屏保时间等等,基本上计算机里大部分的设置,都会使用到 SystemParametersInfo 这个函数。
    现在,我就讲解下实现原理和过程,写成文档分享给大家。
    函数介绍
    检索或设置系统范围参数之一的值。 此功能还可以在设置参数时更新用户配置文件。
    函数声明
    BOOL WINAPI SystemParametersInfo( _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 设置桌面墙纸,第三个参数是墙纸图片的路径,注意路径要求是绝对路径,不能是相对路径。
    编码实现BOOL SetDeskWallpaper(char *pszFileName){ // 路径要求 绝对路径 !! if (FALSE == ::SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, pszFileName, 0)) { ShowError("SystemParametersInfo"); return FALSE; } return TRUE;}
    程序测试直接运行程序,桌面背景图片成功更换。
    总结墙纸图片的路径一定要是绝对路径才能设置成功,使用相对路径,会设置不成功。对于本文介绍的这种修改墙纸的方法,墙纸设置成功,重启电脑后,又会还原回去。所以,这点需要注意。
    参考参考自《Windows黑客编程技术详解》一书
    2  留言 2018-11-07 10:29:11

发送私信

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

12
文章数
15
评论数
eject