VC 实现将程序从任务栏解锁或锁定到任务栏
- 2020 年 1 月 5 日
- 笔记
以前写过一些脚本调用 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; }