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

UWP技术问询:如何以编程方式读取Package.appxmanifest中的Windows协议值

在UWP中编程读取AppManifest的协议扩展值

我之前刚好做过类似的需求,UWP里其实不用手动去解析AppManifest的XML文件,系统提供了专门的API来安全访问清单内容,非常方便。

读取当前应用的协议扩展

核心思路是利用Windows.ApplicationModel.Package类获取当前应用的包信息,然后遍历扩展列表筛选出协议类型的项,再读取对应的属性值。

下面是完整的C#代码示例:

using Windows.ApplicationModel;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public async Task<List<string>> GetCurrentAppProtocolSchemesAsync()
{
    var protocolSchemes = new List<string>();
    // 获取当前应用的包实例
    var currentPackage = Package.Current;
    // 遍历应用的所有扩展
    var allExtensions = currentPackage.Applications.SelectMany(app => app.Extensions);

    foreach (var extension in allExtensions)
    {
        // 筛选出协议类型的扩展(Kind为windows.protocol)
        if (extension.Kind.Equals("windows.protocol"))
        {
            // 读取协议的Scheme名称
            var scheme = extension.Properties["Name"] as string;
            if (!string.IsNullOrWhiteSpace(scheme))
            {
                protocolSchemes.Add(scheme);
            }
            // 若需要读取DisplayName等其他属性,可直接访问Properties对应键值
            // var displayName = extension.Properties["DisplayName"] as string;
        }
    }

    return protocolSchemes;
}

读取其他应用的协议扩展

如果你需要读取其他已安装应用的协议扩展,就需要用到PackageManager类,不过要注意在清单中声明packageQuery权限。代码示例如下:

using Windows.Management.Deployment;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public async Task<List<string>> GetOtherAppProtocolSchemesAsync(string packageFamilyName)
{
    var protocolSchemes = new List<string>();
    var packageManager = new PackageManager();
    // 根据包家族名查找目标应用包
    var targetPackage = packageManager.FindPackagesForUser(string.Empty, packageFamilyName).FirstOrDefault();

    if (targetPackage != null)
    {
        var allExtensions = targetPackage.Applications.SelectMany(app => app.Extensions);
        foreach (var extension in allExtensions)
        {
            if (extension.Kind.Equals("windows.protocol"))
            {
                var scheme = extension.Properties["Name"] as string;
                if (!string.IsNullOrWhiteSpace(scheme))
                {
                    protocolSchemes.Add(scheme);
                }
            }
        }
    }

    return protocolSchemes;
}

注意事项

  • 访问当前应用的清单信息不需要额外权限,直接调用即可。
  • 访问其他应用的清单时,必须在Package.appxmanifest中添加packageQuery权限(在“功能”选项卡中勾选“包查询”)。
  • 如果需要更底层的XML操作,可以访问extension.ExtensionXml属性获取扩展的XML节点,但一般使用Properties就能满足大部分需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:11:10