如何从 运行 UWP 应用程序的 window 中检索 icon/image?

How to retrieve an icon/image from the window of a running UWP application?

我可以使用以下代码从非 UWP 应用程序获取图标:

from win32con GCL_HICON, WM_GETICON,
from win32gui import GetClassLong, SendMessageTimeout

_, icon_handle = SendMessageTimeout(hwnd, WM_GETICON, 1, 0, 0, 50)
if icon_handle == 0:
    icon_handle = GetClassLong(hwnd, GCL_HICON)
    if icon_handle == 0:
        return Settings.BLANK_ICON

Documentation 说下一步应该使用 LoadIcon/LoadImage 从可执行文件中提取它,但我试图避免这种情况。

SO post says UWP app icon path could be retrieved by SHLoadIndirectStringctypes.windll.shlwapi.SHLoadIndirectString 来自 Python),但该主题涉及在注册表中找到的文件关联 - 打开 window 不是起点.

如何检索只有 window 句柄的 "indirect string"?或者也许有人知道这个问题的其他解决方案,我对我能得到的任何类型的 icon/image 感兴趣。

编辑:与 一起接受的答案揭示了一种使用 Python 和 ctypes 解决此问题的方法。

一个 UWP 应用程序的图标不只是一个,可能有很多,以适应特定的设备、外形等。

正如@Simon Mourier所说,大部分"modern app"(或Windows商店应用,或AppX应用模型中的应用)信息都可以从官方API查询。(我只是个搬运工)

您可以从 GetPackageFullName function (it gets the package full name for the specified process). Once you get a package full name, you can use the Package Query API 开始获取更多信息。

这些 API 是原生的,因此据我所知,它们在 .NET Framework 中没有等效项。但是,可以通过某种方式从 WinRT 应用程序访问它们(您确实可以从标准 .NET Framework 应用程序访问某些 WinRT APIs,但这是一种 hack)。

这些应用程序中包含的图像是特殊的,因为它们被定义为资源(​​资产)键,可以使用限定符进行调整以形成最终路径。这在此处记录为示例:How to name resources using qualifiers (HTML) and here: Quickstart: Using file or image resources (HTML).

问题是你能找到什么在很大程度上取决于应用程序本身,所以要确定你可以使用什么图像并不是很容易,我还没有找到任何 API,所以我编写了一个为给定资源名称获取最大规模图像的示例 (FindHighestScaleQualifiedImagePath)。您可以从此路径加载 WPF BitmapSource(或任何其他图像平台资源)。

示例包含在提供的 link 中。详情请参考: