分享
 
 
 

如何在程序中动态设置墙纸

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

大家都知道设置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;

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有