我想提取 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 应用不仅有一个图标,可能还有很多图标,以便能够适应特定设备、外形规格等。示例代码具有一个实用工具,用于获取给定资源的最高比例图像。
对我来说,以下方法有效:
- 打开文件资源管理器并在地址栏中键入
C:/Program Files/WindowsApps
。 - 在">您无权访问此文件夹"对话框中,单击"继续"。这将需要管理员权限。
- 在">您被拒绝访问此文件夹的权限"对话框中,单击以蓝色突出显示的安全选项卡。
- 在">WindowsApps 属性"对话框中,单击"高级"。
- 在">WindowsApps 的高级安全设置"对话框中,单击"继续"。
- 单击所有者:受信任的安装程序旁边的蓝色文本更改。
- 在"选择对象或组"对话框的">输入要选择的对象名称"文本框中,输入您的用户名(打开后立即
C:/User/
cmd 中显示的用户名)。 - 单击检查名称按钮。
- 单击确定按钮。
- 在">WindowsApps 的高级安全设置"对话框中,单击">应用",然后单击"确定"。
- 关闭文件资源管理器。
- 重新打开文件资源管理器,然后再次在地址栏中键入
C:/Program Files/WindowsApps
。
现在您将看到文件夹列表。每个都对应于计算机上安装的 UWP 应用。某些应用位于多个文件夹中。应用的资源位于/Assets
子文件夹中。您也会在那里找到该应用程序的图标。
我认为你必须将两者结合起来,
首先检查AppxManifest.xml并搜索uap:VisualElements
块,
然后在里面找到Square150x150Logo
键,
然后获取相关值并在给定地址中找到文件并使用它。