c++编程 设置桌面壁纸以及设置壁纸失效的解决办法

最近项目中需要一个小工具来设置桌面壁纸,于是想自己尝试用c++写一个。
刚开始,发现COM组件IActiveDesktop 可以设置壁纸。代码如下:

class CCoInitialize {public:CCoInitialize() : m_hr(CoInitialize(NULL)) { }~CCoInitialize() { if (SUCCEEDED(m_hr)) CoUninitialize(); }operator HRESULT() const { return m_hr; }HRESULT m_hr;
};// 设置桌面壁纸(active)
int ApplyWallpaper(char* szFileDirParam, int displayStyle)
{wchar_t* szFileDir = U8ToUnicode(szFileDirParam);CCoInitialize initCom;HRESULT hr;int errNum = 0;std::wstring x = szFileDir;DWORD dwStyle = displayStyle;IActiveDesktop* pIAD;hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,IID_IActiveDesktop, (void**)& pIAD);if (!SUCCEEDED(hr)){errNum = GetLastError();return errNum ;}hr = pIAD->SetWallpaper(x.c_str(), 0);if (!SUCCEEDED(hr)){errNum = GetLastError();return errNum;}WALLPAPEROPT wpo;wpo.dwSize = sizeof(wpo);wpo.dwStyle = dwStyle;hr = pIAD->SetWallpaperOptions(&wpo, 0);if (!SUCCEEDED(hr)){errNum = GetLastError();return errNum;}hr = pIAD->ApplyChanges(AD_APPLY_ALL);if (!SUCCEEDED(hr)){errNum = GetLastError();return errNum;}pIAD->Release();return TRUE;
}

上面这段代码在大多数据情况下,能成功设置壁纸.在实际环境中,发现某些windows10镜像,有窗口覆盖桌面的情况下,不能正确设置壁纸(新壁纸闪现,然后又回到原始桌面壁纸)。看了MSDN,了解到,IActiveDesktop仅用于激活的桌面(原话:“Sets the wallpaper for the Active Desktop.”)。个人猜测是因为有其他窗口覆盖桌面后,桌面状态不是active了,所有设置失效。
后面发现另外一个COM组件 ------ IDesktopWallpaper,该组件同样提供设置桌面壁纸功能。并且没强调需要桌面是激活状态(原话:“Sets the desktop wallpaper.”)。代码如下:

class CCoInitialize {public:CCoInitialize() : m_hr(CoInitialize(NULL)) { }~CCoInitialize() { if (SUCCEEDED(m_hr)) CoUninitialize(); }operator HRESULT() const { return m_hr; }HRESULT m_hr;
};// 设置桌面壁纸
int ApplyWallpaperEx(char* szFileDirParam, int displayStyle)
{wchar_t* szFileDir = U8ToUnicode(szFileDirParam);CCoInitialize initCom;HRESULT hr;int errNum = 0;std::wstring x = szFileDir;DWORD dwStyle = displayStyle;IDesktopWallpaper* pIAD;hr = CoCreateInstance(__uuidof(DesktopWallpaper), 0, CLSCTX_LOCAL_SERVER, __uuidof(IDesktopWallpaper), (void**)&pIAD);if (!SUCCEEDED(hr)){errNum = GetLastError();return errNum ;}// Set first param to NULL to set the wallpaper image on all monitors.hr = pIAD->SetWallpaper(NULL, x.c_str());if (!SUCCEEDED(hr)){errNum = GetLastError();return errNum ;}WALLPAPEROPT wpo;wpo.dwSize = sizeof(wpo);wpo.dwStyle = dwStyle;hr = pIAD->SetPosition(DESKTOP_WALLPAPER_POSITION(dwStyle));if (!SUCCEEDED(hr)){errNum = GetLastError();return errNum ;}if (!SUCCEEDED(hr)){errNum = GetLastError();return errNum ;}pIAD->Release();return TRUE;
}

以代码可以不用理会桌面是否处于激活状态,都能成功设置桌面壁纸。

工作遇到问题,Mark一下。如果你正好需要,欢迎转载or复制。

c++编程 设置桌面壁纸以及设置壁纸失效的解决办法相关推荐

  1. “此环境变量太大, 此对话框允许将值设置为最长2047个字符”的解决办法

    "此环境变量太大, 此对话框允许将值设置为最长2047个字符"的解决办法 新建系统变量: 写入变量名和变量值(变量路径) 选中path,点击编辑 把以前的 变量值(变量路径),用 ...

  2. 关于请设置注册表项Framewoke.....初始化错误的解决办法

    关于请设置注册表项Framework-初始化错误的解决办法) 本人电脑运行环境windows7 百度过很多网上所谓的解决办法,如下 1.重新下载/更高版本的Framework--本人正在使用最新的Fr ...

  3. 黑莓“设备与桌面管理器之间的通信出错”解决办法

    http://hi.baidu.com/cuny/blog/item/cfee074f3653bd3aaec3ab5e.html 黑莓7130/7100/8100/8120/8310/8800,&qu ...

  4. 关于电脑壁纸分辨率低的原因及解决办法(个人感悟,并非系统性的盘点)

    笔者的电脑是19年买的华为matebook D,当时刚上大一,但是刚拿到电脑,设置了东京喰种的壁纸,发现很模糊,但是对计算机一窍不通,就这样将就着用了近两年. 今天突然想深究背景图片模糊及解决办法. ...

  5. iphone 在设置了initial-scale=1 之后,在设置滚动条之后,没有滑动效果的解决办法...

    iphone在设置了initial-scale=1 之后,我们终于可以以1:1 的比例进行页面设计了. 关于viewport,还有一个很重要的概念是:iphone 的safari 浏览器完全没有滚动条 ...

  6. win11 更新后无法打开商店、记事本、设置、计算器等内置应用的解决办法【亲测有效】

    这个是win11更新后容易出现的问题. 一般造成原因是MS-Settings文件系统错误. 解决办法:原理不过多解释,比较专业和复杂.先重启电脑(重要),如果不重启可能造成修复报错很多,重启后不要运行 ...

  7. 设置apple watch解锁mac显示无法通信解决办法

    最近很多网友都在问"设置apple watch解锁mac显示无法通信是什么原因",试试小编为大家带来的这个方法吧. 1.在"钥匙串访问"里选"显示&q ...

  8. uniapp App端 echarts 设置tooltip的formatter不生效问题及解决办法

    一.开发需求 在App端实现,图表的tooltip提示框中展示数值的单位.如下图: 二.遇到的问题 1.首先想到的是对tooltip进行相关的设置,然后试了两种方式,都没有效果. (1)设置toolt ...

  9. Qt窗口设置成透明色方法(窗口设置成透明色结果显示成黑色的解决办法)

    在Qt界面背景设置中,有时候想把窗口背景设置成透明色,结果界面显示成黑色的解决办法如下(亲测有效): ipLinkWidget->setWindowFlag(Qt::FramelessWindo ...

最新文章

  1. 你的知识死角不能否定你的技术能力
  2. RabbitMQ集群原理介绍
  3. Android 横屏启动activity,点击屏幕的单击、双击和长按事件
  4. 微信喊你来找工作:上千家企业将提供超10万个就业岗位
  5. linux重启后mysql无法启动_Linux重启后MySQL数据库文件全部丢失MySQL无法启动
  6. sublime实用快捷键 mac版
  7. 微信文件夹的dat文件怎么打开_使用什么软件打开微信dat文件
  8. php 时间转换时间戳_PHP日期格式转时间戳
  9. c语言打印long double,C/C++printf输出int、long、longlong、double、longdouble、string等
  10. 一文极速读懂 KEGG 数据库
  11. c语言猜拳游戏教案,幼儿园中班游戏《猜拳游戏》的教案
  12. Pyecharts 1.7.0制作图表,运行生成的html文件用浏览器打开空白问题(以桑基图为例)
  13. 喜大普奔!Maya 2022来了?!
  14. javaweb网上宠物商城管理系统分前后台(源码+数据库+开题报告+ppt+文档)
  15. TIM定时中断(定时器介绍)
  16. 考研日语线上笔记(三):初级日语语法总结20课
  17. 形容计算机专业的人词语,形容专业技术好的词语
  18. lssvm回归 matlab,用lssvm做回归预测,预测的结果偏差很大,如何进行参数寻优
  19. 02_平面转换 transform
  20. 人物志 | 知道创宇赵伟:一个核武器的自白

热门文章

  1. 计算机网络——哈工大李全龙
  2. 【补作业】msp430单片机(一)控制LED灯的亮灭
  3. 数字图像处理_Matlab——车牌识别分析
  4. android 多个catch,【Android开发坑系列】之try-catch
  5. Unity GoogleVR Cardboard 开发
  6. 数据在内存中的存储形式
  7. 网页中标签对搜索引擎的影响
  8. 【滤波跟踪】基于随机有限集的多目标跟踪算法附matlab代码
  9. jira 史诗 故事 任务_史诗般的数据提取任务
  10. 如何在iPhone之间共享您的Wi-Fi密码?