前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VC 实现将程序从任务栏解锁或锁定到任务栏

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

作者头像
我与梦想有个约会
发布2020-01-05 15:08:53
8670
发布2020-01-05 15:08:53
举报
文章被收录于专栏:jiajia_dengjiajia_deng

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

代码语言:javascript
复制
// 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;
}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年11月2日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档