gpt4 book ai didi

c++ - 如何在 Windows 8 和 10 中枚举已安装的 StoreApps 及其 ID

转载 作者:可可西里 更新时间:2023-11-01 10:05:15 25 4
gpt4 key购买 nike

我想要获取的是所有已安装的 StoreApp 应用程序的 AppUserModelId,以便我可以将其传递给 IApplicationActivationManager->ActivateApplication

在 Windows 8 中它存储在注册表中,但在 Windows 10 中它不再存在。

网上有很多关于这个的问题,但即使经过几天的搜索,我也找不到令人满意的解决方案。

到目前为止,我有以下内容:

  1. 我创建了一个 IPackageManager 的实例,
  2. 我用当前用户的 SID 调用 FindPackagesByUserSecurityId()
  3. 我遍历返回的集合
  4. 我得到一个IPackage接口(interface)
  5. 从中我得到一个IPackageId接口(interface),
  6. 然后我调用 IPackageId->get_FamilyName()

例如,我在 Windows 10 上为 Windows 计算器设置了字符串“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”时,它不会启动 ->“此应用不支持指定的契约(Contract)”。

所以我的问题是我从哪里得到最后缺失的部分?

我在互联网上发现了一个 PowerShell 代码 ( http://poshcode.org/5702 ),它似乎做的事情非常相似:

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 接口(interface),我就可以调用 IAppInfo->get_Id() 我就准备好了。

但我不知道如何从 C++ 中的 IPackage 中获取它。

最佳答案

令人难以置信的是,没有人有想法!这表明微软是如何让我们生活艰难的。像枚举已安装的 StoreApps 及其 AppUserModelId 这样的通用任务需要一个科学研究部门。

我终于找到了一个在 Windows 8 和 Windows 10 上完美运行的解决方案。但是需要大量代码。

Windows 似乎没有在内存中保存应用程序 ID,也没有 API 可以直接确定它们。我研究了 Windows 10 SDK 中的所有头文件,但找不到可用于该任务的相应接口(interface)。

但我找到了获取它们的方法。我在问题的 6 个步骤之后继续:

  1. 调用 IPackage->get_InstalledLocation() 返回一个 IStorageFolder
  2. IStorageItem 的查询接口(interface)
  3. 调用IStorageItem->get_Path()

现在您有了安装应用程序的路径。 Windows 10 使用两个基本文件夹:

  • C:\Program Files\WindowsApps
  • C:\Windows\SystemApps

还有其他几个类似的

  • C:\Windows\vpnplugins
  • C:\Windows\devicesflow
  • C:\Windows\MicracastView
  • C:\Windows\PrintDialog
  • C:\Windows\PrintDialog3D
  • C:\Windows\WinStore

在返回的文件夹路径中,您将找到一个文件“AppxManifest.xml”。这个文件看起来像:

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns=".....">
......
......
<Applications>
<Application Id="microsoft.windowslive.mail" Executable="HxMail.exe" EntryPoint="Executable">
......
......
</Application>
<Application Id="microsoft.windowslive.calendar" Executable="HxCalendarAppImm.exe" EntryPoint="Executable">
......
......
</Application>
</Applications>
</Package>

瞧,它们就在那里。此程序包有两个应用程序 ID:“microsoft.windowslive.mail”和“microsoft.windowslive.calendar”。

然后您从第 6 步中获取包的 FamilyName 附加一个“!”并附加此 ID,您就完成了。

此包可以使用 AppUserModelId 之一通过 IApplicationActivationManager->ActivateApplication() 启动:

  • microsoft.windowscommunicationsapps_8wekyb3d8bbwe!microsoft.windowslive.calendar
  • microsoft.windowscommunicationsapps_8wekyb3d8bbwe!microsoft.windowslive.mail

关于c++ - 如何在 Windows 8 和 10 中枚举已安装的 StoreApps 及其 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32150759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com