win7如何把一个程序锁定到任务栏

本文介绍了一种使用C++编程的方法,通过调用Windows API来实现将应用程序锁定到Windows 7任务栏的功能。首先获取IShellDispatch接口,然后通过NameSpace方法创建Folder对象,接着解析文件名得到FolderItem,最后遍历FolderItem的verbs找到“锁定到任务栏”的verb并执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "stdafx.h"

#include "PinAppToTaskbar.h"

#include <Shlwapi.h>

#include <atlpath.h>

#include <shobjidl.h>

 

#define RETURN_IF_NULL_EX(ret, pPointer) { \

    if (!(pPointer)) \

    { \

    return ret; \

    } \

}

 

#define RETURN_IF_FALSE_EX(ret, val) { \

    if (!(val)) \

    { \

    return ret; \

    } \

}

 

 

//1. 得到IShellDispatch

//2. 得到Folder

//3. 得到FolderItem

//4. 得到Verb

//5. 执行verb

 

long PinAppToTaskbar(const CString& csFullName)

{

    if (!PathFileExists(csFullName))

    {

        return ERROR_FILE_NOT_FOUND;

    }

 

    //加载字符串,形如"锁定到任务栏(K)"

    //如果找不到,则可能系统版本低于win7

    HINSTANCE hInst = ::LoadLibrary(_T("Shell32.dll"));

    CString csVerb;

    ::LoadString(hInst, 5386, csVerb.GetBuffer(256), 256);

    ::FreeLibrary(hInst);

    csVerb.ReleaseBuffer();

 

    if (csVerb.IsEmpty())

    {

        //只有在win7及以上才支持

        return CO_E_WRONGOSFORAPP;

    }

 

    CLSID clsid;

    ::CLSIDFromProgID(_T("Shell.Application"), &clsid);

    CComQIPtr<IShellDispatch> pShell;

 

    HRESULT hr = ::CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void**)&pShell);

    ASSERT(SUCCEEDED(hr));

    RETURN_IF_FALSE_EX(hr, SUCCEEDED(hr));

 

    CString csName = PathFindFileName(csFullName);

    CPath path(csFullName);

    path.RemoveFileSpec();

    CString csPath = path;

 

    CComVariant varPath(csPath);

    CComQIPtr<Folder> pFolder;

 

    //NameSpace方法

    //Creates and returns a Folder object for the specified folder.

    pShell->NameSpace(varPath, &pFolder);

    ASSERT(pFolder);

    RETURN_IF_NULL_EX(E_NOINTERFACE, pFolder);

 

    CComBSTR bstrName(csName);

    CComQIPtr<FolderItem> pFolderItem;

    //ParseName方法 Creates and returns a FolderItem object that represents a specified item.

    pFolder->ParseName(bstrName, &pFolderItem);

    ASSERT(pFolderItem);

    RETURN_IF_NULL_EX(E_NOINTERFACE, pFolderItem);

 

    CComQIPtr<FolderItemVerbs> pVerbs;

    pFolderItem->Verbs(&pVerbs);

    ASSERT(pVerbs);

    long lCount = 0;

    pVerbs->get_Count(&lCount);

    for (long i = 0; i < lCount; ++i)

    {

        CComQIPtr<FolderItemVerb> pOneVerb;

        pVerbs->Item(CComVariant(i), &pOneVerb);

        CComBSTR bstrVerbName;

        pOneVerb->get_Name(&bstrVerbName);

        if (CString(bstrVerbName).Compare(csVerb) == 0)

        {

            pOneVerb->DoIt();

            return S_OK;

        }

    }

    return E_FAIL;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值