如何创建带跳转列表的C++控制台应用程序?
如何在C++控制台程序中实现Windows跳转列表(Jump List)
没问题!作为COM新手,确实会觉得跳转列表的API有点绕,但咱们可以把它拆成简单的步骤,直接塞进你的main函数里。下面是一个完整的可编译示例,我会一步步解释关键部分,帮你快速上手。
完整代码示例
#include <windows.h> #include <shobjidl.h> #include <iostream> #pragma comment(lib, "shell32.lib") #pragma comment(lib, "ole32.lib") int main(int argc, char* argv[]) { // 1. 初始化COM环境(必须步骤,跳转列表依赖COM组件) HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); if (!SUCCEEDED(hr)) { std::cout << "COM初始化失败,错误码: " << hr << std::endl; return 1; } // 2. 获取跳转列表的核心接口ICustomDestinationList ICustomDestinationList* pDestList = nullptr; hr = CoCreateInstance(CLSID_DestinationList, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDestList)); if (!SUCCEEDED(hr)) { std::cout << "获取ICustomDestinationList接口失败,错误码: " << hr << std::endl; CoUninitialize(); return 1; } // 3. 准备跳转列表的基本信息:设置应用ID(用程序自身路径即可) WCHAR szExePath[MAX_PATH]; GetModuleFileNameW(nullptr, szExePath, MAX_PATH); hr = pDestList->SetAppID(szExePath); if (!SUCCEEDED(hr)) { std::cout << "设置应用ID失败,错误码: " << hr << std::endl; pDestList->Release(); CoUninitialize(); return 1; } // 4. 创建任务列表容器,用于添加跳转项 IObjectArray* pObjectArray = nullptr; hr = pDestList->BeginList(nullptr, IID_PPV_ARGS(&pObjectArray)); if (!SUCCEEDED(hr)) { std::cout << "开始创建跳转列表失败,错误码: " << hr << std::endl; pDestList->Release(); CoUninitialize(); return 1; } // 5. 添加第一个跳转任务:打开记事本 IShellLinkW* pLink = nullptr; hr = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pLink)); if (SUCCEEDED(hr)) { // 设置要执行的程序路径 pLink->SetPath(L"C:\\Windows\\notepad.exe"); // 设置任务显示名称 pLink->SetDescription(L"打开记事本"); // 设置任务图标(复用记事本的图标) pLink->SetIconLocation(L"C:\\Windows\\notepad.exe", 0); // 将ShellLink包装成可添加到跳转列表的对象 IPropertyStore* pPropStore = nullptr; hr = pLink->QueryInterface(IID_PPV_ARGS(&pPropStore)); if (SUCCEEDED(hr)) { pObjectArray->AddObject(pPropStore); pPropStore->Release(); } pLink->Release(); } // 6. 添加第二个跳转任务:打开当前程序的新实例 hr = CoCreateInstance(CLSID_ShellLink, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pLink)); if (SUCCEEDED(hr)) { pLink->SetPath(szExePath); pLink->SetDescription(L"打开新的程序实例"); pLink->SetIconLocation(szExePath, 0); IPropertyStore* pPropStore = nullptr; hr = pLink->QueryInterface(IID_PPV_ARGS(&pPropStore)); if (SUCCEEDED(hr)) { pObjectArray->AddObject(pPropStore); pPropStore->Release(); } pLink->Release(); } // 7. 提交跳转列表,让系统生效 hr = pDestList->CommitList(); if (SUCCEEDED(hr)) { std::cout << "跳转列表创建成功!右键任务栏图标查看效果~" << std::endl; } else { std::cout << "提交跳转列表失败,错误码: " << hr << std::endl; } // 8. 释放所有COM资源(必须步骤,避免内存泄漏) pObjectArray->Release(); pDestList->Release(); CoUninitialize(); return 0; }
关键步骤拆解
- COM初始化:Windows跳转列表基于COM组件实现,所以必须先调用
CoInitializeEx启动COM环境,程序结束时用CoUninitialize清理资源。 - 核心接口
ICustomDestinationList:这是操作跳转列表的入口,负责创建列表、设置应用标识、提交最终的任务列表。 IShellLink快捷方式:每个跳转任务本质上是一个Shell快捷方式,用这个接口可以设置任务的执行路径、显示名称、图标等关键信息。- 提交生效:调用
CommitList后,系统会把我们定义的任务同步到任务栏,此时右键程序图标就能看到添加的跳转项了。
编译与测试注意事项
- 确保你的项目是Windows控制台程序,不要选跨平台模板。
- 代码里的
#pragma comment(lib, ...)会自动链接所需的系统库,如果手动配置项目,记得添加shell32.lib和ole32.lib。 - 测试时,运行程序后不要关闭它,右键任务栏上的程序图标,就能看到你添加的跳转任务啦。
内容的提问来源于stack exchange,提问作者DrakeMcCain
相关产品推荐
相关产品推荐

