如何从正在运行的UWP应用程序的窗口中检索图标/图像?

时间:2019-06-26 13:28:58

标签: c# python winapi uwp pywin32

我可以使用以下代码从非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说,SHLoadIndirectString(可以从Python使用ctypes.windll.shlwapi.SHLoadIndirectString来检索UWP应用程序图标路径,但是该主题涉及在注册表中找到的文件关联-一个打开的窗口是“ t的起点。

如何检索仅具有窗口句柄的“间接字符串”?也许有人知道解决此问题的其他方法,我对我可以获得的任何类型的图标/图像都感兴趣。

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

1 个答案:

答案 0 :(得分:2)

UWP应用程序不仅有一个图标,而且可能有很多图标,以便能够适应特定的设备,外形等。

如@Simon Mourier所说,大多数“现代应用程序”(或Windows Store应用程序,或AppX应用程序模型中的应用程序)信息都可以从官方API中查询。(我只是个搬运工)

您可以从GetPackageFullName函数开始(它获得指定进程的软件包全名)。获得包全名后,即可使用Package Query API获取更多信息。

这些API是本机API,因此在我所知的.NET Framework中没有。但是,可以通过WinRT应用程序以某种方式访问​​它们(并且您确实可以从标准.NET Framework应用程序访问某些WinRT API,但这是种hack)。

这些应用程序中包含的图像是特殊的,因为它们被定义为资源(​​资产)键,可以使用限定符对其进行调整以形成最终路径。例如,在这里How to name resources using qualifiers (HTML)和这里:快速入门:Using file or image resources (HTML)

问题在于,您可以找到的内容在很大程度上取决于应用程序本身,因此,确定要使用的图像不是一件容易的事,而且我还没有找到任何API,因此我编写了一个可扩展到最大比例的示例给定资源名称的图像,例如(FindHighestScaleQualifiedImagePath。您可以从该路径加载WPF BitmapSource(或任何其他影像平台资源)。

样品包含在提供的链接中。有关详细信息,请参阅:

Get Icon from UWP App