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

来源:互联网 发布:程序员怎么抢游戏号 编辑:程序博客网 时间:2024/05/17 04:00
需要包括的头文件方法如下所示:

一、在 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;}


原创粉丝点击