大家都知道设置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. C# 封装 System.Data.SQLite

    参考1: 关于如何使用System.Data.SQLite的入门: http://www.dreamincode.net/forums/topic/157830-using-sqlite-with-c ...

  2. git撤销修改

    在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交: $ git add test.txt $ git commit -m "add test. ...

  3. putty修改编码

    在窗口标题上点击右键,选择 Change Settings... 在打开的配置窗口左边选择 Appearance,在右边点 Font settings 里面的 Change 按钮,选择好中文字体,比如 ...

  4. Android Fragment真正意义上的onResume和onPause

    Fragment虽然有onResume和onPause的,但是这两个方法是Activity的方法,调用时机也是与Activity相同,和ViewPager搭配使用这个方法就很鸡肋了,根本不是你想要的效 ...

  5. JS中定义类的方法<转>

    转载地址:http://blog.csdn.net/sdlfx/article/details/1842218 PS(个人理解): 1) 类通过prototype定义的成员(方法或属性),是每个类对象 ...

  6. CSS自学笔记(16):CSS3 用户界面

    CSS3中,也新增了一些关于用户界面的属性,这些属性可以重设元素或者盒子的尺寸.轮廓等等. 新增的部分属性的浏览器支持情况 属性 浏览器支持 resize IE Firefox Chrome Safa ...

  7. Linux下安装Wireshark

    Linux下安装Wireshark wireshark依赖于libpcap,所以如果系统中未安装libpcap,也要将其一并安装 一.下载源码 源码文件 wireshark-x.x.x.tar.gz  ...

  8. Oracle EBS-SQL (INV-2):检查帐户别名发放记录.sql

    SELECT FU.description                 操作者,         ITM.SEGMENT1               物料编码,         ITM.DESC ...

  9. EF 6 调用存储过程时返回多结果集和OUTPUT参数问题

    原文地址:http://q.cnblogs.com/q/56836/ 各位大侠,提问一个关于EF6调用存储过程时返回多结果集和OUTPUT参数问题 目前已经可以调用存储过程并且可以返回多个结果集. 但 ...

  10. LINQpad 用法汇总

    // C# Expression //Courses // .Join ( // CourseSections, // course => course.CourseId, // section ...