【发布时间】:2015-08-21 23:38:52
【问题描述】:
我想要得到的是所有已安装的 StoreApp 应用程序的 AppUserModelId,这样我就可以将它传递给IApplicationActivationManager->ActivateApplication。
在 Windows 8 中它存储在注册表中,但在 Windows 10 中不再存在。
互联网上有很多关于此的问题,但即使经过几天的搜索,我也找不到令人满意的解决方案。
到目前为止,我有以下内容:
- 我创建了一个
IPackageManager的实例, - 我用当前用户的 SID 调用
FindPackagesByUserSecurityId(), - 我遍历返回的集合
- 我得到一个
IPackage接口 - 从中我得到一个
IPackageId接口, - 然后我打电话给
IPackageId->get_FamilyName()
例如,我在 Windows 10 上为 Windows Calculator 提供了字符串“Microsoft.WindowsCalculator_8wekyb3d8bbwe”。
当我在这个字符串上附加一个“!App”时,我拥有完整的 AppUserModelId 来启动 Windows 计算器:“Microsoft.WindowsCalculator_8wekyb3d8bbwe!App”
但并非所有应用程序都在 FamilyName 后面使用“!App”。
例如 Spartan 使用 AppUserModelId
“Microsoft.Windows.Spartan_cw5n1h2txyewy!Microsoft.Spartan.Spartan”不以“!App”结尾。当我将“!Microsoft.Spartan.Spartan”替换为“!App”时,它不会启动->“此应用不支持指定的合同”。
所以我的问题是我从哪里得到最后一个缺失的部分?
我在互联网 (http://poshcode.org/5702) 上发现了一个 PowerShell 代码,它似乎做了非常相似的事情:
Get-AppXPackage $PackageName -pv Package |
Get-AppxPackageManifest | % {
foreach($Application in $_.Package.Applications.Application) {
if($Application.Id -like $AppId) {
if($Protocol -and !($Application.Extensions.Extension.Protocol.Name | ? { ($_ + "://") -match (($Protocol -replace '\*','.*') + "(://)?") })) {
continue
}
[PSCustomObject]@{
# Notice the secret magic property:
PSTypeName = "Microsoft.Windows.Appx.Application"
AppUserModelId = $Package.PackageFamilyName + "!" + $Application.Id
}
}
}
}
我真的不明白这个神秘的 PowerShell 东西,但我觉得有一句话很有趣:
foreach($Application in $_.Package.Applications.Application)
这似乎枚举了一个包中的应用程序。
同一 PowerShell 代码中的注释说:
# The full AppUserModelId is composed of the package name,
the publisher id, and the app id, such as
Microsoft.ZuneMusic_8wekyb3d8bbwe!Microsoft.ZuneMusic
所以缺少的是$Application.Id。
如果我能得到一个IAppInfo 接口,我可以调用IAppInfo->get_Id(),我就准备好了。
但我不知道如何从 C++ 中的 IPackage 获取此信息。
【问题讨论】:
标签: c++ windows powershell app-store