如何从C#桌面应用程序中检索Windows应用商店应用程序的图标?

时间:2016-06-07 18:39:59

标签: c# windows-store-apps

在C#中,获取.exe文件的图标很容易。你只需做Icon.ExtractAssociatedIcon(path)和vo。 但是,如果我想获得的图标不是标准的.exe,而是这些新奇的Windows应用商店应用之一呢?

有没有办法在我的C#app中将Windows应用商店应用的图标作为Bitmap对象?

2 个答案:

答案 0 :(得分:0)

这个问题已在超级用户的一般方法上得到了回答: https://superuser.com/questions/478975/how-to-create-a-desktop-shortcut-to-a-windows-8-modern-ui-app

如果你想在C#中做 - 它部分取决于你从哪里开始。您想要特定应用的图标或所有应用的图标吗?您知道应用,应用名称或应用ID的路径吗?

您可以使用PowerShell Get-AppxPackage命令获取应用列表。我没有走得太远,但是要从C#中做到这一点,你会安装System.Management.Automation NuGet包,然后运行这样的东西:

using (var runspace = RunspaceFactory.CreateRunspace(InitialSessionState.CreateDefault()))
{
    runspace.Open();

    PowerShell powerShellCommand = PowerShell.Create();
    powerShellCommand.Runspace = runspace;
    powerShellCommand.AddScript("Get-AppxPackage |?{!$_.IsFramework}");

    foreach (var result in powerShellCommand.Invoke())
    {
        try
        {
            if (result.Properties.Match("Name").Count > 0 &&
                result.Properties.Match("InstallLocation").Count > 0)
            {
                var name = result.Properties["Name"].Value;
                var installLocation = result.Properties["InstallLocation"].Value;
                Console.WriteLine(installLocation.ToString());
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
    }

    runspace.Close();
}

上面的问题是它返回了许多非实际应用程序的组件包。我找不到一种简单的方法来查找应用程序显示名称。您可以破解在安装位置找到的AppxManifest.xml,但是对于任何本地化的应用程序,它的显示名称都会有“ms-resource:ApplicationTitleWithBranding”,从应用程序外部提取起来似乎很复杂。

要从注册表中获取应用程序列表,您可以使用Microsoft.Win32.Registry类从“HKEY_CLASSES_ROOT \ Extensions \ ContractId \ Windows.Protocol \ PackageId”中读取注册表,然后使用超级用户上描述的技术得到平铺图像。

答案 1 :(得分:0)

如果是Windows存储UWP应用程序,您将拥有所谓“间接字符串”形式的应用程序图标路径。 例如对于Groove音乐:

$result

要从间接字符串SHLoadIndirectString提取正常路径,可以使用API​​函数。

@{Microsoft.ZuneMusic_10.18011.12711.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.ZuneMusic/Files/Assets/AppList.png}