大家都知道设置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. TCP/IP详解之:TCP

    第17章 TCP:传输控制协议 TCP提供了一种可靠的面向连接的字节流运输层服务 TCP的服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务. TCP通过下 ...

  2. PHP开发调试环境配置

    ——基于wamp和Eclipse for PHP Developers 引言 为了搭建PHP开发调试环境,我曾经在网上查阅了无数的资料,但没有一种真正能够行的通的.因为PHP开发环境需要很多种软件相互 ...

  3. mysql性能优化学习笔记(3)常见sql语句优化

    一.max()优化mysql> explain select max(payment_date) from payment;+----+-------------+---------+----- ...

  4. Python作业day2购物车

    流程图: 实现情况: 可自主注册, 登陆系统可购物,充值(暂未实现),查询余额. 撸了两天一夜的代码,不多说,直接上码,注释神马的后面再说 #!/usr/bin/env python # -*- co ...

  5. 排列与组合的C语言实现

    排列与组合是数学里的经典问题,由这个问题可引申出子集.字典排序等问题,那么,我们先看经典的排列与组合,怎么在程序里实现. 在网上搜了一下,关注这个问题的人还是挺多的,有不了人给出的回答是使用几个for ...

  6. Java实现验证码图片

    这样的实现方式对JDK版本有要求. 1 package edu.cloud.editmap.utils; import java.awt.Color; import java.awt.Font; im ...

  7. wx.button

    wx.Button A button is a control that contains a text string, and is one of the most common elements ...

  8. SQL Server中的DATEPART函数的使用

    下面文章来自:http://blog.csdn.net/hello_world_wusu/article/details/4632049 定义和用法 DATEPART() 函数用于返回日期/时间的单独 ...

  9. [android开发IDE]adt-bundle-windows-x86的一个bug:无法解析.rs文件--------rs_core.rsh file not found

    google的android自带的apps写的是相当牛逼的,将其导入到eclipse中方便我们学习扩展.可惜关于导入的资料太少了,尤其是4.1之后的gallery和camera合二为一了.之前导4.0 ...

  10. CSS实现倒影-------Day80

    发现这个功能的时候非常开心,结果不想居然是个残次品,让我不禁想起了"天龙八部"上段誉的六脉神剑,在这个浏览器上能够.在还有一个上就无论了啊,时灵时不灵的,只是有总比没有要来的好,一 ...