编程设置壁纸有很多办法,可以调用SystemParametersInfo、修改注册表、还可以通过Windows Shell提供的IActiveDesktop接口来实现。
 
IActiveDesktop接口是一个COM接口,需要按照调用COM组件的方法来使用它。这里通过应用IActiveDesktop接口来说明COM的使用方法。
 
奇怪的是,必须包含wininet.h,而且顺序不能错,见下面的顺序:
#include <afxwin.h>         // MFC 核心组件和标准组件
#include <wininet.h>
#include <afxext.h>         // MFC 扩展
否则会提示找不到IActiveDesktop的定义。
 
1.调用CoInitialize在当前线程初始化COM库。
::CoInitialize(NULL);
 
2.使用CoCreateInstance函数,创建 ActiveDesktop对象的实例,获取ActiveDesktop对象的IActiveDesktop接口指针,成功后对象的使用计数加一。
 
    IActiveDesktop *pActiveDesktop=NULL;
    //Create an instance of the Active Desktop
    HRESULT hr = ::CoCreateInstance(
           
CLSID_ActiveDesktop,
            NULL,
            CLSCTX_INPROC_SERVER,
            IID_IActiveDesktop,
            (void**)&pActiveDesktop);
    if (FAILED(hr))
    {
        printf("Create ActiveDesktop failure:0x%08X\n",hr);
        return -1;
    }
 
2.1 调用SetWallpaper方法设置桌面壁纸。
    USES_CONVERSION;
    hr=pActiveDesktop->SetWallpaper(
A2W("F:\\我的文档\\My Pictures\\xinsrc_55203051817196711110236.jpg"),0);
    if (FAILED(hr))
    {
        printf("SetWallpaper failure:0x%08X\n",hr);
        return -1;
    }
 
2.2 调用ApplyChanges方法应用当前设置。
    hr=pActiveDesktop->ApplyChanges(AD_APPLY_ALL);
    if (FAILED(hr))
    {
        printf("ApplyChanges failure:0x%08X\n",hr);
        return -1;
    }
 
3.调用Release方法释放接口,这时对象的使用计数减一。
pActiveDesktop->Release();
 
4.调用CoUninitialize在当前线程释放COM库。
::CoUninitialize();
 
 

 


本文链接地址: COM.2 用实例说明COM的使用(用IActiveDesktop设置壁纸)
https://blog.qingfengju.com/index.asp?id=80

上一篇: COM.4 COM(Component Object Model,组件对象模型)深入学习
下一篇: COM.3 用VC++生成接口的COleDispatchDriver包装类来调用COM组件

分类:Win32/C++ 查看次数:9110 发布时间:2009/6/16 12:41:48