C++ 设置桌面壁纸

定义一个函数来实现主要的功能:
HRESULT SetDesktopWallpaper(PWSTR pszFile, WallpaperStyle style);

WallpaperStyle是一个枚举类型,定义了壁纸显示的类型

enum WallpaperStyle
{
    Tile,//平铺
    Center,//居中
    Stretch,//拉伸
    Fit, //适应
    Fill//填充
};
//
//   FUNCTION: SetDesktopWallpaper(PCWSTR, WallpaperStyle)
//
//   PURPOSE: Set the desktop wallpaper.
//
//   PARAMETERS: 
//   * pszFile - Path of the wallpaper
//   * style - Wallpaper style
//
HRESULT SetDesktopWallpaper(PWSTR pszFile, WallpaperStyle style)
{
    HRESULT hr = S_OK;
 
	//设置壁纸风格和展开方式
	//在Control Panel\Desktop中的两个键值将被设置
    // TileWallpaper
    //  0: 图片不被平铺 
    //  1: 被平铺 
    // WallpaperStyle
    //  0:  0表示图片居中,1表示平铺
    //  2:  拉伸填充整个屏幕
    //  6:  拉伸适应屏幕并保持高度比
    //  10: 图片被调整大小裁剪适应屏幕保持纵横比

	//以可读可写的方式打开HKCU\Control Panel\Desktop注册表项
    HKEY hKey = NULL;
    hr = HRESULT_FROM_WIN32(RegOpenKeyEx(HKEY_CURRENT_USER, 
        L"Control Panel\\Desktop", 0, KEY_READ | KEY_WRITE, &hKey));
    if (SUCCEEDED(hr))
    {
        PWSTR pszWallpaperStyle;
        PWSTR pszTileWallpaper;

        switch (style)
        {
        case Tile:
            pszWallpaperStyle = L"0";
            pszTileWallpaper = L"1";
            break;

        case Center:
            pszWallpaperStyle = L"0";
            pszTileWallpaper = L"0";
            break;

        case Stretch:
            pszWallpaperStyle = L"2";
            pszTileWallpaper = L"0";
            break;

        case Fit: // (Windows 7 and later)
            pszWallpaperStyle = L"6";
            pszTileWallpaper = L"0";
            break;

        case Fill: // (Windows 7 and later)
            pszWallpaperStyle = L"10";
            pszTileWallpaper = L"0";
            break;
        }
        // 设置 WallpaperStyle 和 TileWallpaper 到注册表项.
        DWORD cbData = lstrlen(pszWallpaperStyle) * sizeof(*pszWallpaperStyle);
        hr = HRESULT_FROM_WIN32(RegSetValueEx(hKey, L"WallpaperStyle", 0, REG_SZ, 
            reinterpret_cast<const BYTE *>(pszWallpaperStyle), cbData));
        if (SUCCEEDED(hr))
        {
            cbData = lstrlen(pszTileWallpaper) * sizeof(*pszTileWallpaper);
            hr = HRESULT_FROM_WIN32(RegSetValueEx(hKey, L"TileWallpaper", 0, REG_SZ, 
                reinterpret_cast<const BYTE *>(pszTileWallpaper), cbData));
        }

        RegCloseKey(hKey);
    }

	//通过调用Win32 API函数SystemParametersInfo 设置桌面壁纸
	/************************************************
	之前我们已经设置了壁纸的类型,但是壁纸图片的实际文件路径还没
	设置。SystemParametersInfo 这个函数位于user32.dll中,它支持
	我们从系统中获得硬件和配置信息。它有四个参数,第一个指明调用这
	个函数所要执行的操作,接下来的两个参数指明将要设置的数据,依据
	第一个参数的设定。最后一个允许指定改变是否被保存。这里第一个参数
	我们应指定SPI_SETDESKWALLPAPER,指明我们是要设置壁纸。接下来是
	文件路径。在Vista之前必须是一个.bmp的文件。Vista和更高级的系统
	支持.jpg格式
	*************************************************/
	//SPI_SETDESKWALLPAPER参数使得壁纸改变保存并持续可见。
    if (SUCCEEDED(hr))
    {
        if (!SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, 
            static_cast<PVOID>(pszFile), 
            SPIF_UPDATEINIFILE | SPIF_SENDWININICHANGE))
        {
            hr = HRESULT_FROM_WIN32(GetLastError());
        }
    }

    return hr;
}


  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白话机器学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值