如何在程序中动态设置墙纸
来源:互联网 发布:阿里云使用教程 编辑:程序博客网 时间:2024/04/28 14:35
原文链接:http://www.cnblogs.com/lzjsky/archive/2011/01/17/1937514.html
大家都知道设置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 CShowDemoDlg::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的要求 TCHAR wszWallpaper [MAX_PATH]; LPTSTR lpStr = strPicFile.GetBuffer(strPicFile.GetLength() ); _tcscpy(wszWallpaper, lpStr);// 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(); 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 CShowDemoDlg::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 desktopcomp.fActiveDesktop = bEnable;hr = pIAD->SetDesktopItemOptions(&comp, 0);if(!SUCCEEDED(hr)) return FALSE;//释放接口的实例pIAD->Release();return TRUE;}
- 如何在程序中动态设置墙纸
- 如何在程序中动态设置墙纸
- 如何在程序中动态设置墙纸
- 如何在程序中动态设置墙纸
- 如何在程序中动态设置墙纸
- 如何在程序中动态设置墙纸
- 如何在程序中动态设置墙纸
- PAIP.在程序中设置壁纸墙纸
- 如何在Delphi中更改墙纸
- 在Delphi中更改墙纸
- 如何在代码中动态设置java_library_path?
- 动态墙纸
- 如何在基于对话框的程序中动态设置鼠标指针
- 设置墙纸
- 在PB程序中如何设置打印机?
- 如何在Android程序中设置代理
- 如何在程序中启动并显示“设置”程序
- 在DELPHI程序中动态设置ODBC数据源
- 工具
- CMFCShellTreeCtrl和CMFCShellListCtrl快速构建资源管理器
- NET学习网站
- Oracle存储过程实例
- ImageSwitcher_Gallery的使用
- 如何在程序中动态设置墙纸
- VirtualBox网络设置与应用详解4种方式的应用介绍
- 用邮件分割和传送大文件,python实现 I
- 聊聊并发(五)——原子操作的实现原理
- linux驱动头文件说明(转载)
- Primer plus C++ 第十一章 类和动态内存分配_反面理解String类(class and dynamic memory allocation)
- BGP配置之 default-metric metric
- mac 快捷键
- “general error c101008d”错误的处理