You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建带跳转列表的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:28:42