我想提取一个 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/