MFC中使用COM组件更改桌面壁纸或图标

17 篇文章 3 订阅
14 篇文章 0 订阅
需要包括的头文件方法如下所示:

一、在 stdafx.h 文件中添加如下头文件:

#pragma once

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
#endif

#include "targetver.h"

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的

// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC 核心组件和标准组件
#include <afxext.h>         // MFC 扩展
#include   "wininet.h "         //you   should   Add     

#include <afxdisp.h>        // MFC 自动化类
#include <afxdtctl.h>           // MFC 对 Internet Explorer 4 公共控件的支持


#ifndef _AFX_NO_OLE_SUPPORT
#include <afxcmn.h>             // MFC 对 Windows 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT

#endif // _AFX_NO_AFXCMN_SUPPORT
#include   <afxconv.h>             //you   should   Add     
#include <afxcontrolbars.h>     // 功能区和控件条的 MFC 支持 

二、在应用程序BOOL CBZApp::InitInstance() 中添加
AfxOleInit();


三、在使用IActiveDesktop的文件中添加:
#include <shlobj.h>


示例代码如下:

BOOL CBZDlg::SetWallPaper(CString strPath)
{
    HRESULT hr;
   IActiveDesktop* pIAD;

   hr = CoCreateInstance( CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER,
                           IID_IActiveDesktop, (void**)&pIAD);
   if ( !SUCCEEDED(hr) )
       return FALSE;
   
   // 设置墙纸前先打开活动桌面开关
   COMPONENTSOPT co = {0};
   co.dwSize = sizeof(COMPONENTSOPT);
   co.fEnableComponents = TRUE;
   co.fActiveDesktop = TRUE;
   hr = pIAD->SetDesktopItemOptions(&co, 0);
   if ( !SUCCEEDED(hr) ) 
       return FALSE;
   
   //做以下宽字符的转换是因为SetWallpaper的参数是用的LPCWSTR
   WCHAR wszPath[MAX_PATH];
   LPTSTR lpStr = strPath.GetBuffer(strPath.GetLength());
   MultiByteToWideChar(CP_ACP, 0, lpStr, -1, wszPath, MAX_PATH);
   strPath.ReleaseBuffer();

   // 设置墙纸
   hr = pIAD->SetWallpaper(wszPath, 0);
   if ( !SUCCEEDED(hr) )
       return FALSE;

   // 设置墙纸风格
   WALLPAPEROPT wp = {0};
   wp.dwSize = sizeof(WALLPAPEROPT);
   wp.dwStyle |= WPSTYLE_CENTER;
   hr = pIAD->SetWallpaperOptions(&wp, 0);
   if ( !SUCCEEDED(hr) )
       return FALSE;

   // 应用改变
   hr = pIAD->ApplyChanges(AD_APPLY_ALL);
   if ( !SUCCEEDED(hr) )
       return FALSE;

   // 最后释放接口,不要忘了
   pIAD->Release(); 
    return TRUE;      
}

获取桌面壁纸路径方法

void GetDesktopIconPath()
{
	// 1. 初始化COM库(让Windows加载DLLs)。通常是在程序的InitInstance()中调用  
	// CoInitialize ( NULL )或其它启动代码。MFC程序使用AfxOleInit()。  
	CoInitialize(NULL);
	WCHAR   wszWallpaper[MAX_PATH];
	CString strPath;
	HRESULT hr;
	IActiveDesktop* pIAD;
	// 2. 使用外壳提供的活动桌面组件对象类创建COM对象。  
	// 第四个参数通知COM需要什么接口(这里是IActiveDesktop).  
	hr = CoCreateInstance(CLSID_ActiveDesktop,NULL,CLSCTX_INPROC_SERVER,IID_IActiveDesktop,(void**)&pIAD);
	if (SUCCEEDED(hr))
	{
		// 3. 如果COM对象被创建成功,则调用这个对象的GetWallpaper() 方法。  
		hr = pIAD->GetWallpaper(wszWallpaper, MAX_PATH, 0);
		if (SUCCEEDED(hr))
		{
			// 4. 如果 GetWallpaper() 成功,则输出它桌面壁纸文件名字。  
			// 注意这里使用wcout 来显示Unicode 串wszWallpaper. 
			//wcout 是Unicode 专用,功能与cout.相同。  
		}

		// 5. 释放接口。  
		pIAD->Release();
	}
	// 6. 收回COM库。MFC 程序不用这一步,它自动完成。  
	CoUninitialize();
}

添加快捷方式的方法

CString      sWallpaper = L"C:\\Users\\Administrator\\Desktop\\test.exe";  //创建快捷方式
IShellLink*   pISL;
IPersistFile* pIPF;
// 1. 初始化COM库(让Windows 加载DLLs). 通常在InitInstance()中调用  
// CoInitialize ( NULL )或其它启动代码。MFC 程序使用AfxOleInit()。  
CoInitialize(NULL);
// 2. 使用外壳提供的Shell Link组件对象类创建COM对象。.  
// 第四个参数通知COM 需要什么接口(这里是IShellLink)。   
HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void**)&pISL);
if (SUCCEEDED(hr))
{
	// 3. 设置快捷方式目标(墙纸文件)的路径。  
	hr = pISL->SetPath(sWallpaper);
	if (SUCCEEDED(hr))
	{
		// 4. 获取这个对象的第二个接口(IPersistFile)。  
		hr = pISL->QueryInterface(IID_IPersistFile, (void**)&pIPF);
		if (SUCCEEDED(hr))
		{
			// 5. 调用Save() 方法保存某个文件的快捷方式。第一个参数是  Unicode 串。  
			hr = pIPF->Save(L"C:\\测试.lnk", FALSE);
			// 6. 释放IPersistFile 接口。  
			pIPF->Release();
		}
	}
	// 6. 释放IShellLink 接口。  
	pISL->Release();
}
// 输出错误信息部分这里省略。  
// 7. 收回COM 库。MFC 程序不用这一步,它自动完成。  
CoUninitialize();

更换快捷方式图标

bool ChangeLinkIcon(const CString &strLnkName, const CString &strIconPath)
{
	HRESULT hres;
	IShellLink *psl = NULL;
	IPersistFile *pPf = NULL;
	bool bRet = false;
	do
	{
		hres = CoInitialize(NULL);
		if (SUCCEEDED(hres))
		{
			hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
			if (SUCCEEDED(hres))
			{
				psl->QueryInterface(IID_IPersistFile, (LPVOID*)&pPf);
				if (SUCCEEDED(hres))
				{
					pPf->Load(strLnkName, STGM_READWRITE);
					if(SUCCEEDED(hres))
					{
						hres = psl->SetIconLocation(strIconPath, 0);
						if(SUCCEEDED(hres))
						{
							pPf->Save(strLnkName, TRUE);
						}
					}
				}
			}
		}
	} while (0);

	if (pPf != NULL)
		pPf->Release();

	if (psl != NULL)
		psl->Release();

	CoUninitialize();
	return bRet;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值