大家都知道设置WINDOWS桌面墙纸的WIN32 API是SystemParametersInfo, 使用SPI_SETDESKWALLPAPER参数便能设置墙纸:
  ::SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, "C:\\ABitmap.bmp", SPIF_SENDWININICHANGE | SPIF_UPDATEINIFILE);
  但问题并没有解决,因为这个WIN32 API有很大的局限性
  1. 无法把jpeg, gif等其他非位图格式的图片设为墙纸。
  2. 无法调整墙纸的式样,即无法设置墙纸为居中,平铺或拉伸。(当然我们可以通过编程改变注册表HKEY_CURRENT_USER\Control Panel\Desktop的值来做到这一点)
  由于在显示属性系统对话框内很容易手动设置这些选项,我们有理由相信,Windows Shell API一定提供了相应的比较高层的函数,接口或类来完成墙纸的设置。事实上,Windows Shell API中确实存在完成这个任务的接口:IActiveDesktop。
  以下是我所完成的设置墙纸的函数
  //strPicFile是图像文件名,支持BMP JPEG GIF等格式
  //dwStyle是墙纸的样式
  //WPSTYLE_CENTER 居中 0
  //WPSTYLE_TILE 平铺 1
  //WPSTYLE_STRETCH 拉伸 2 
  //WPSTYLE_MAX 3
  //返回值是TRUE时墙纸设置成功,返回FALSE时失败
  BOOL SetWallpaper(CString &strPicFile, DWORD dwStyle)
  {
   HRESULT hr;
   IActiveDesktop* pIAD;
   //创建接口的实例
   hr = CoCreateInstance ( CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, 
   IID_IActiveDesktop, (void**) &pIAD );
   if(!SUCCEEDED(hr)) return FALSE;
   //将文件名改为宽字符串,这是IActiveDesktop::SetWallpaper的要求
   WCHAR wszWallpaper [MAX_PATH];
   LPTSTR lpStr = strPicFile.GetBuffer(strPicFile.GetLength() );
   MultiByteToWideChar(CP_ACP, 0, lpStr, -1, wszWallpaper, MAX_PATH);
   strPicFile.ReleaseBuffer();
   //设置墙纸
   hr = pIAD->SetWallpaper(wszWallpaper, 0);
   if(!SUCCEEDED(hr)) return FALSE;
   //设置墙纸的样式
   WALLPAPEROPT wpo;
   wpo.dwSize = sizeof(wpo);
   wpo.dwStyle = dwStyle;
   hr = pIAD->SetWallpaperOptions(&wpo, 0);
   if(!SUCCEEDED(hr)) return FALSE;
   //应用墙纸的设置
   hr = pIAD->ApplyChanges(AD_APPLY_ALL);
   if(!SUCCEEDED(hr)) return FALSE;
   //读取墙纸的文件名并打印在debug窗口内
   hr = pIAD->GetWallpaper(wszWallpaper, MAX_PATH, 0);
   CString strFile = wszWallpaper;
   TRACE(strFile); //如果不用位图的话,这里有你意想不到的发现
   //释放接口的实例
   pIAD->Release();
   return TRUE;
  }
  在MFC程序中应用此函数时,须注意以下三点。
  1.在函数所在文件中加上声明IActiveDesktop的头文件
  #include<shlobj.h>
  2.在StdAfx.h中插入#include <wininet.h>
  位置不能搞错,否则IActiveDesktop将找不到定义
  #include <afxwin.h> // MFC core and standard components
  #include <wininet.h> // NOTE: corrects compilation errors w/IActiveDesktop!! 
  #include <afxext.h> // MFC extensions
  3.由于此函数引用了COM组件,所以必须在C**App::OnInitInstance()中插入以下语句,初始化COM组件。
  AfxOleInit();
  补充:
  只有在安装了IE4.0及以上版本时才能应用IActiveDesktop接口,只有在打开active desktop(活动桌面)的情况下才能应用SetWallpaper函数,下面是启用或关闭active desktop的函数:
  //bEnable是TRUE时启用active desktop, 是FALSE时关闭
  //返回值是TRUE时启用或关闭active desktop成功,返回FALSE时失败
  BOOL EnableActiveDesktop(BOOL bEnable)
  {
   HRESULT hr;
   IActiveDesktop* pIAD;
   //创建接口的实例
   hr = CoCreateInstance ( CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, 
   IID_IActiveDesktop, (void**) &pIAD );
   if(!SUCCEEDED(hr)) return FALSE;
   COMPONENTSOPT comp;
   comp.dwSize = sizeof(comp);
   comp.fEnableComponents = bEnable;
   //启用或关闭active desktop
   comp.fActiveDesktop = bEnable;
   hr = pIAD->SetDesktopItemOptions(&comp, 0);
   if(!SUCCEEDED(hr)) return FALSE;
   //释放接口的实例
   pIAD->Release;
   return TRUE;
  }

http://www.cnblogs.com/lzjsky/archive/2011/01/17/1937514.htm

如何在程序中动态设置墙纸(使用IActiveDesktop接口)的更多相关文章

  1. 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法

    前段时间开发了一款微信小程序,运行了也几个月了,在index.js中的onLoad生命周期里获取app.js中onLaunch生命周期中在接口里动态设置的globalData一直没有问题,结果昨天就获 ...

  2. Android 在程序中动态添加 View 布局或控件

    有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法: 1.addView 添加View到布局容器 2.removeView 在布局容器中删掉已有的View 3.LayoutPar ...

  3. Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定).      这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户 ...

  4. 在MVC应用程序中动态加载PartialView

    原文:在MVC应用程序中动态加载PartialView 有时候,我们不太想把PartialView直接Render在Html上,而是使用jQuery来动态加载,或是某一个事件来加载.为了演示与做好这个 ...

  5. Quartz在Spring中动态设置cronExpression

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

  6. 分别在javascript和JSP中动态设置下拉列表默认值

    一.JavaScript中动态设置select标签中<option>选项的默认值: 比如,要完成下边这个下拉列表的动态显示,并且当进行前后翻页时,下拉列表中的值自动更新为当前页码: 图1 ...

  7. 小程序之--动态设置页面标题 wx.setNavigationBarTitle

    参考地址 http://www.yilingsj.com/xwzj/2018-11-26/weixin-navigationbartitletext.html 页面最初是[在线教研] 可以在这个页面的 ...

  8. 在WCF程序中动态修改app.config配置文件

    今天在个WCF程序中加入了修改配置文件的功能.我是直接通过IO操作修改的app.config文件内容,修改后发现发现其并不生效,用Google搜了一下,在园子里的文章动态修改App.Config 和w ...

  9. ASP.NET MVC程序中动态修改form的Action值

    在练习ASP.NET MVC时,为了实现一个小功能,POST数据至服务器执行时,需要动态修改form的action值. 下面Insus.NET列举一个例子来演示它.让它简单,明白易了解. 你可以在控制 ...

随机推荐

  1. Google搜索的配置方法

    在百度慢慢沦落为广告商的搜索引擎之后,对于一个追求技术的程序员,他所要追求的搜索引擎永远都应该是google. 下面保存一下我使用的能够FQ实现google搜索的方法和一些面试的测试账号. 小飞机sh ...

  2. gridView行号的显示

    我们在进行开发的时候,很多地方希望dataGridview或girdView显示行号,这里我来说一下两种的实现方法 在girdView中很简单很好实现,我在这里写一下代码,具体其他功能可以看其带的DE ...

  3. JavaScript基本概念(变量和数据类型)

    1. 变量 在局部作用域中省略var操作符可以定义全局变量,但是这么做会导致该变量难以维护,且在严格模式下会导致抛出ReferenceError错误. 2. 数据类型(js共用6种数据类型,分别是 U ...

  4. yum 安装 5.6

    http://www.cnblogs.com/XBlack/p/5178758.html

  5. Dynamics CRM 2013 初体验(5):Business Rule

    新系统中的Business Rule是个不错的功能,相信它的出现能减少大量的开发工作.在日常开发中,我们需要对记录做大量的业务控制.比如:某字段是否要隐藏,某字段的值是否符合要求以及现实提醒信息等.在 ...

  6. 第一个使用Writer写的博客

    今天开通的博客园的博客账户,先来尝试一下用哪种方式最适合写博. 目前用Live Writer. 以后计划在这里分享数据技术的技术体会和学习心得,尤其是大数据和数据仓库相关的知识.Hello my bl ...

  7. LFM 隐语义模型

    隐语义模型: 物品       表示为长度为k的向量q(每个分量都表示  物品具有某个特征的程度) 用户兴趣 表示为长度为k的向量p(每个分量都表示  用户对某个特征的喜好程度) 用户u对物品i的兴趣 ...

  8. Apache的Access.log分析总结

    Apache的Access.log分析总结 #查看80端口的tcp连接  #netstat -tan | grep "ESTABLISHED" | grep ":80&q ...

  9. 【java读书笔记】——java开篇宏观把控 + HelloWorld

    学完java有一段时间了,一直没有做对应的总结,总认为有一种缺憾.从这篇博客開始,将自己平时的学习笔记进行总结归纳,分享给大家. 这篇博客主要简单的介绍一下java的基础知识,基本的目的是扫盲.原来仅 ...

  10. gcc中-pthread和-lpthread的区别

    最近在使用linux mint15,里面自带的gcc时4.7的,当我编译多线程程序时,使用-lpthread居然说没有找到线程库函数!!!然后man了一下,才发现在gcc 4.7中链接线程库使用-pt ...