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

Windows环境下将UWP应用快捷方式拖入Qt应用后,如何获取应用包名与应用ID以启动该应用?

从拖入的UWP开始菜单项中提取启动标识的解决方案

我之前正好解决过几乎一模一样的问题——从拖入Qt应用的UWP开始菜单快捷方式里提取启动所需的包名+应用ID组合,给你梳理下具体的实现步骤和关键要点:

核心思路:利用ShellItem的属性直接获取AppUserModelID

你已经通过SHCreateShellItemArrayFromIDLists拿到了IShellItem,这一步非常关键。Windows为UWP应用的开始菜单项预设了一个核心属性AppUserModelID,它的格式正好是你需要的PackageFamilyName!AppID(比如VideoLAN.VLC_paz6r1rewnh0a!App),完全不需要手动解析PIDL的复杂结构。

具体实现步骤

  1. 将IShellItem转换为IShellItem2
    IShellItem2是IShellItem的扩展接口,提供了直接访问Shell项属性的方法,我们需要它来读取AppUserModelID。通过QueryInterface完成转换:

  2. 读取PKEY_AppUserModel_ID属性
    使用IShellItem2::GetString方法,传入预定义的PKEY_AppUserModel_ID属性键,就能直接获取到完整的启动标识字符串。

代码示例(C++/Qt环境)

// 假设你已经从ShellItemArray中获取到了单个IShellItem* pShellItem
// (拖入单个应用时,取数组的第一个元素即可)

IShellItem2* pShellItem2 = nullptr;
HRESULT hr = pShellItem->QueryInterface(IID_PPV_ARGS(&pShellItem2));

if (SUCCEEDED(hr)) {
    PWSTR pszAppUserModelID = nullptr;
    // 读取AppUserModelID属性
    hr = pShellItem2->GetString(PKEY_AppUserModel_ID, &pszAppUserModelID);

    if (SUCCEEDED(hr)) {
        // 转换为Qt的QString使用
        QString fullAppId = QString::fromWCharArray(pszAppUserModelID);
        qDebug() << "完整启动标识:" << fullAppId;

        // 如果需要拆分包名和应用ID,直接按"!"分割
        QStringList parts = fullAppId.split('!');
        if (parts.size() == 2) {
            QString packageName = parts.first();
            QString appId = parts.last();
            qDebug() << "包名:" << packageName << "应用ID:" << appId;
        }

        // 记得释放分配的字符串
        CoTaskMemFree(pszAppUserModelID);
    }

    // 释放IShellItem2接口
    pShellItem2->Release();
}

// 释放原始的IShellItem接口
pShellItem->Release();

必要的头文件与初始化

确保你的代码包含以下头文件:

#include <shobjidl.h>
#include <propkey.h>
#include <propvarutil.h>

另外,调用Shell COM API前,必须初始化COM环境(一般在应用启动时执行一次即可):

CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

为什么不用手动解析PIDL?

PIDL的结构非常依赖Shell的内部实现,不同版本的Windows可能有差异,手动解析不仅容易出错,还需要处理大量底层细节。而通过IShellItem2读取属性是Windows官方推荐的方式,既稳定又简洁。

启动UWP应用的补充

拿到AppUserModelID后,你可以用Windows的ShellExecuteEx来启动应用,比如:

SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.fMask = SEE_MASK_NOASYNC;
sei.lpVerb = L"open";
sei.lpFile = pszAppUserModelID; // 直接传入AppUserModelID
sei.nShow = SW_SHOWNORMAL;
ShellExecuteEx(&sei);

内容的提问来源于stack exchange,提问作者Thomas Stachl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:34:05