c# - 从 UWP 应用获取图标

标签 c# uwp icons

我想提取一个 UWP 应用程序的图标来构建一个类似“打开方式”菜单的资源管理器。

SHAssocEnumHandlers的帮助下我设法将关联的应用程序获取到给定的文件扩展名。

IAssocHandler::GetIconLocation我得到的 UWP Apps (Microsoft Edge) 是这样的:

@{Microsoft.MicrosoftEdge_41.16299.371.0_neutral__8wekyb3d8bbwe?ms-resource://Microsoft.MicrosoftEdge/Files/Assets/MicrosoftEdgeSquare44x44.png}

如果我使用 SHLoadIndirectString在这个字符串上我得到:

C:\WINDOWS\SystemApps\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\Assets\MicrosoftEdgeSquare44x44.scale-100.png

但这是错误的图标(没有颜色或对比度)。

在目录中:

C:\WINDOWS\SystemApps\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\Assets\

有很多不同的图像。 我不明白如何选择正确的图标。

我试图查找“AppxManifest.xml”,但对于不同的应用程序,我看起来完全不同。

对于非 UWP 应用程序,我得到的 IconLocation 类似于:

C:\WINDOWS\system32\NOTEPAD.EXE

然后我可以使用:

Icon.ExtractAssociatedIcon()

一切都很好。我没有找到任何方法来对 UWP 应用执行相同的操作。

最佳答案

可以从官方 API 查询 UWP 应用(或 Windows 应用商店应用,或有时称为“AppX 应用模型”的应用)信息。

这些 API 没有 C# 等效的 AFAIK,但我在 SO 上对类似问题的回答中提供了示例代码来执行此操作:Getting icon of “modern” Windows app from a desktop application?

示例应用程序转储所有当前加载的 Windows 应用商店程序包和应用程序。

请注意,UWP 应用程序的图标不只是一个,可能有很多,以适应特定的设备、外形等。示例代码有一个实用程序,可以获取给定资源的最大规模图像。

关于c# - 从 UWP 应用获取图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50217328/

相关文章:

c++ - 来自 C++ 资源的对话框的左上角图标

c# - 将结构数组从 C++ 编码到 C#?

uwp - 声明的包依赖项不存在。 - 超湿压

javascript - UWP 应用程序 - HTML5/JS 中的 InkCanvas 和 InkToolbar

xamarin.forms - 从另一个基于应用程序的类继承 UWP 应用程序类时,命名空间 "AppClass"中不存在名称 "..."

c# - 如何在 .NET 中创建和使用资源

c# - 字典错误调试中不存在给定的键

c# - 在托管代码和非托管代码之间传递结构

c# - 这是否违反了开闭原则?

java - Swing JCheckbox : Focus with customized icons