如何在Windows 8和10

时间:2015-08-21 23:38:52

标签: c++ windows powershell app-store

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

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

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

到目前为止我的内容如下:

  1. 我创建了IPackageManager
  2. 的实例
  3. 我使用当前用户的SID调用FindPackagesByUserSecurityId()
  4. 我遍历返回的集合
  5. 我得到一个IPackage界面
  6. 从那里我得到一个IPackageId界面,
  7. 然后我致电IPackageId->get_FamilyName()
  8. 我在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获取此内容。

2 个答案:

答案 0 :(得分:3)

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

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

Windows似乎没有将应用程序ID保存在内存中,并且没有API直接确定它们。我研究了Windows 10 SDK中的所有头文件,但找不到对该任务有用的相应界面。

但我发现了如何获得它们。我在问题的6个步骤之后继续:

  1. 致电IPackage->get_InstalledLocation(),返回IStorageFolder
  2. IStorageItem
  3. 的QueryInterface
  4. 致电IStorageItem->get_Path()
  5. 现在你已经安装了应用程序的路径。 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

答案 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