大家都知道设置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. 27 Remove Element

    Given an array and a value, remove all instances of that value in place and return the new length. T ...

  2. codeforces 几道题目

    BZOJ挂了....明天就要出发去GDKOI了....不能弃疗. 于是在cf水了几道题, 写写详(jian)细(dan)题解, 攒攒RP, 希望GDKOI能好好发挥.......  620E. New ...

  3. 饿了么 天降红包 bug ----这是谁的错

    早上来点餐,从没用饿了么点成功过,因为太难用. 今早,不,应该说前几天,出了个天降红包,领了个满20 减110的红包,没在意,因为还没升级客户端,不能用. 今早来,升级了一下客户端,下单了,看了饿了么 ...

  4. 远程连接mysql数据慢的问题

    由于公司没有服务器,买的阿里云的服务器用于开发,所以就在本地连接服务器的mysql. 连接很慢,打开表也很慢,一开始没多想,以为是网络慢而已. 最近,开发经常要使用navicat连接数据库,实在是太慢 ...

  5. 对discuz的代码分析学习(四)论坛入口文件

    只是大致分析下执行流程,主要就是取得mod参数的值,根据取值加载控制器,控制器位置在最后一行指定了. 1 )定义应用名称,加载两个必要文件 define('APPTYPEID', 2); define ...

  6. python基础(三)

    set集合 set集合创建 #方式1: se = {'} #与字典类似dict1 = {'k1','v1','k2','v2'} #方式2: se = set() #创建一个空的集合 list1 = ...

  7. MRD-5012型RS232,RS485有源隔离中继模块,采用磁隔离技术,金升阳DC-DC隔离电源,纯硬件自适应方向,速度高达256000bps

    RS485\RS232磁隔离中继模块MRD-5012能够实现232转485或者485转485通信信号的电气隔离,同时提高驱动能力,能够在实现通信信号隔离并且延长通信距离,使485节点可以最大增加到25 ...

  8. Type Correlation

    Types of correlation: Logical correlation: Using pre-defined and customized correlation rules. Inven ...

  9. nova availability zone

    find a bug: at first there is only one zone. create aggregate host1 in zone1 create aggregate host1 ...

  10. linux下主要是VirtualBox及GuestAdditions的安装

    Linux版本的VirtualBox下载:http://www.virtualbox.org/wiki/Linux_Downloads.请下载对应的版本. RedHat.RHEL:rpm -i vh ...