VC 实现将程序从任务栏解锁或锁定到任务栏

以前写过一些脚本调用 Shell Object 实现的解锁和锁定程序到任务栏的功能,这几天刚好用到,却不想用脚本实现,由于没有了解过 VC 如何操作 Shell,所以就在 github 上搜索了一下,找到了示例代码,自己修改了一下以后备用。代码有使用方法和注释。

// TaskbarShortcut.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <shlobj.h>

/************************************************************************/
/* 
/* 代码来源:https://github.com/prestocore/browser/blob/8c5977d18f4ed8aea10547829127d52bc612a725/platforms/windows/WindowsShortcut.cpp
/* 函数功能:将程序锁定或从任务栏解锁
/* 函数参数:
/* lpPath:要锁定或解锁文件的路径
/* lpFileName:要锁定或解锁文件的文件名
/* bIsPin:TRUE 为锁定文件到任务栏,FALSE 为从任务栏解锁,默认为 FALSE
/* 
/************************************************************************/

BOOL TaskbarPin(LPTSTR lpPath, LPTSTR lpFileName, BOOL bIsPin = FALSE)
{
    BOOL bRet = FALSE;
    HMENU hmenu = NULL;
    LPSHELLFOLDER pdf = NULL;
    LPSHELLFOLDER psf = NULL;
    LPITEMIDLIST pidl = NULL;
    LPITEMIDLIST pitm = NULL;
    LPCONTEXTMENU pcm = NULL;

    if (SUCCEEDED(SHGetDesktopFolder(&pdf))
        && SUCCEEDED(pdf->ParseDisplayName(NULL, NULL, lpPath, NULL, &pidl,  NULL))
        && SUCCEEDED(pdf->BindToObject(pidl, NULL, IID_IShellFolder, (void **)&psf))
        && SUCCEEDED(psf->ParseDisplayName(NULL, NULL, lpFileName, NULL, &pitm,  NULL))
        && SUCCEEDED(psf->GetUIObjectOf(NULL, 1, (LPCITEMIDLIST *)&pitm, IID_IContextMenu, NULL, (void **)&pcm))
        && (hmenu = CreatePopupMenu()) != NULL
        && SUCCEEDED(pcm->QueryContextMenu(hmenu, 0, 1, INT_MAX, CMF_NORMAL)))
    {
        CMINVOKECOMMANDINFO ici = { sizeof(CMINVOKECOMMANDINFO), 0 };
        ici.hwnd = NULL;
        ici.lpVerb = bIsPin ? "taskbarpin" : "taskbarunpin";
        pcm->InvokeCommand(&ici);
        bRet = TRUE;
    }

    if (hmenu)
        DestroyMenu(hmenu);
    if (pcm)
        pcm->Release();
    if (pitm)
        CoTaskMemFree(pitm);
    if (psf)
        psf->Release();
    if (pidl)
        CoTaskMemFree(pidl);
    if (pdf)
        pdf->Release();

    return bRet;
}

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(nullptr);

    // 将 Win7 默认的 Media Player 快捷方式从任务栏取消固定
    TaskbarPin(
        _T("C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs"),
        _T("Windows Media Player.lnk")
    );

    // 将 Win7 默认的 IE 快捷方式从任务栏取消固定
    TaskbarPin(
        _T("C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs"),
        _T("Internet Explorer.lnk")
    );

    CoUninitialize();
    return 0;
}

评论