从 UWP 应用获取图标



我想提取 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 应用程序,我得到的图标位置如下所示:

C:\WINDOWS\system32\记事本

.EXE

然后我可以使用:

Icon.ExtractAssociatedIcon()

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

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

这些 API 没有 C# 等效的 AFAIK,但我在回答 SO 上的类似问题时提供了示例代码来执行此操作:从桌面应用程序获取"现代"Windows 应用程序的图标?

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

请注意,UWP 应用不仅有一个图标,可能还有很多图标,以便能够适应特定设备、外形规格等。示例代码具有一个实用工具,用于获取给定资源的最高比例图像。

对我来说,以下方法有效:

  1. 打开文件资源管理器并在地址栏中键入C:/Program Files/WindowsApps
  2. 在">您无权访问此文件夹"对话框中,单击"继续"。这将需要管理员权限。
  3. 在">您被拒绝访问此文件夹的权限"对话框中,单击以蓝色突出显示的安全选项卡
  4. 在">WindowsApps 属性"对话框中,单击"高级"。
  5. 在">WindowsApps 的高级安全设置"对话框中,单击"继续"。
  6. 单击所有者:受信任的安装程序旁边的蓝色文本更改
  7. 在"选择对象或组"对话框的">输入要选择的对象名称"文本框中,输入您的用户名(打开后立即C:/User/cmd 中显示的用户名)。
  8. 单击检查名称按钮。
  9. 单击确定按钮。
  10. 在">WindowsApps 的高级安全设置"对话框中,单击">应用",然后单击"确定"。
  11. 关闭文件资源管理器
  12. 重新打开文件资源管理器,然后再次在地址栏中键入C:/Program Files/WindowsApps

现在您将看到文件夹列表。每个都对应于计算机上安装的 UWP 应用。某些应用位于多个文件夹中。应用的资源位于/Assets子文件夹中。您也会在那里找到该应用程序的图标。

我认为你必须将两者结合起来,

首先检查AppxManifest.xml并搜索uap:VisualElements块,

然后在里面找到Square150x150Logo键,

然后获取相关值并在给定地址中找到文件并使用它。

最新更新