需要包括的头文件方法如下所示:
二、在应用程序BOOL CBZApp::InitInstance() 中添加
AfxOleInit();
三、在使用IActiveDesktop的文件中添加:
#include <shlobj.h>
更换快捷方式图标
一、在 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;
}