从UWP应用程序获取图标

11

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

通过SHAssocEnumHandlers的帮助下,我成功地获取了与给定文件扩展名相关联的应用程序。

使用IAssocHandler::GetIconLocation时,对于UWP应用(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\NOTEPAD.EXE

然后我可以使用:

Icon.ExtractAssociatedIcon()

一切都很好。我没有找到任何方法来在UWP应用程序中做同样的事情。


请问,您找到了什么吗? - Liviu
1
可能是 https://dev59.com/7lwY5IYBdhLWcg3w36-G#36559301 的重复。 - Simon Mourier
@Simon:我认为你可能是对的,如果没有适当的API,这可能是我们所能做的最好的。如果你想提交作为答案,我可以尝试接受它。 - Jon Tackabury
3个回答

6

可以通过官方API查询UWP应用程序(或Windows Store应用程序,或者称为“AppX应用程序模型”)的信息。

据我所知,这些API没有C#等效项,但是我在SO上回答类似问题时提供了样例代码:如何从桌面应用程序获取“现代”Windows应用程序的图标?

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

请注意,UWP应用程序不仅有一个图标,可能有多个,以适应特定设备、形态因素等。该示例代码具有可获取给定资源的最高比例图像的实用程序。


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

  1. 打开文件资源管理器,将C:/Program Files/WindowsApps输入地址栏。
  2. 在显示“您无权访问此文件夹”的对话框中,单击继续。这需要管理员权限。
  3. 在显示“您已被拒绝访问此文件夹”的对话框中,单击突出显示为蓝色的安全选项卡。
  4. 在“WindowsApps属性”对话框中,单击高级选项卡。
  5. 在“WindowsApps的高级安全设置”对话框中单击继续
  6. 单击紧挨着所有者:TrustedInstaller旁边的更改文本(蓝色)。
  7. 在“选择对象或组”对话框中的输入要选择的对象名称文本框中输入您的用户名(在打开命令提示符后,在C:/User/下方显示的用户名)。
  8. 单击检查名称按钮。
  9. 单击确定按钮。
  10. 在“WindowsApps的高级安全设置”对话框中,单击应用,然后单击确定
  11. 关闭文件资源管理器
  12. 重新打开文件资源管理器,再次将C:/Program Files/WindowsApps输入地址栏中。
现在您将看到一个文件夹列表,每个文件夹对应于您计算机上安装的UWP应用程序。一些应用程序在多个文件夹中。应用程序的资源存放在/Assets子文件夹中。您还可以在那里找到应用程序的图标。

不幸的是,这对获取应用程序图标没有帮助。有了几十个PNG文件的文件夹,您如何知道要使用哪个正确的文件? - Jon Tackabury

1
我认为你需要将两者结合起来, 首先检查AppxManifest.xml并搜索uap:VisualElements块, 然后在其中找到Square150x150Logo键, 接着获取相关的值并在给定地址中查找文件并使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接