我想要的是所有已安装的StoreApp应用程序的AppUserModelId,以便我可以将其传递给IApplicationActivationManager->ActivateApplication
。
在Windows 8中,它存储在注册表中,但在Windows 10中它不再存在。
互联网上存在很多关于此的问题,但即使经过几天的搜索,我也找不到令人满意的解决方案。
到目前为止我的内容如下:
IPackageManager
,FindPackagesByUserSecurityId()
IPackage
界面IPackageId
界面,IPackageId->get_FamilyName()
我在Windows 10上为Windows计算器提供了字符串" Microsoft.WindowsCalculator_8wekyb3d8bbwe
"。
当我将此字符串附加到" !App
"我有完整的AppUserModelId来启动Windows计算器:" Microsoft.WindowsCalculator_8wekyb3d8bbwe!App
"
但并非所有应用程序都使用" !App
"在FamilyName后面。
例如,Spartan使用AppUserModelId
"的 Microsoft.Windows.Spartan_cw5n1h2txyewy!Microsoft.Spartan.Spartan
"不以" !App
"结尾。当我更换" !Microsoft.Spartan.Spartan
"用" !App
"它不会启动 - > "此应用不支持指定的合同"。
所以我的问题是我从哪里获得最后一个缺失的部分?
我在互联网上发现了一个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
界面,我可以打电话给IAppInfo->get_Id()
,我就准备好了。
但我不知道如何从C ++中IPackage
获取此内容。
答案 0 :(得分:3)
难以置信,没有人有想法! 这表明微软如何让我们的生活变得艰难。 像使用AppUserModelId枚举已安装的StoreApps这样的通用任务需要一个科学研究部门。
我终于找到了一个在Windows 8和Windows 10上完美运行的解决方案。但是需要很多代码。
Windows似乎没有将应用程序ID保存在内存中,并且没有API直接确定它们。我研究了Windows 10 SDK中的所有头文件,但找不到对该任务有用的相应界面。
但我发现了如何获得它们。我在问题的6个步骤之后继续:
IPackage->get_InstalledLocation()
,返回IStorageFolder
。IStorageItem
IStorageItem->get_Path()
现在你已经安装了应用程序的路径。 Windows 10使用两个基本文件夹:
和其他几个像
在返回的文件夹路径中,您会找到一个文件“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
”答案 1 :(得分:0)
使用PackageManager API枚举包,并使用GetPackageApplicationIds枚举包中的应用程序,例如伪代码
"System.setProperty("webdriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");"
有关详细信息,请参阅MSDN上的GetPackageApplicationIds(),包括工作示例代码 https://msdn.microsoft.com/en-us/library/windows/desktop/dn270603(v=vs.85).aspx