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

C# 如何从正在运行的UWP应用程序的窗口中检索图标/图像?,c#,python,winapi,uwp,pywin32,C#,Python,Winapi,Uwp,Pywin32,我可以通过以下代码从非UWP应用程序中获取图标: 来自win32con GCL\u HICON,WM\u GETICON, 从win32gui导入GetClassLong,SendMessageTimeout _,icon_handle=SendMessageTimeout(hwnd,WM_GETICON,1,0,0,50) 如果图标\u句柄==0: icon\u handle=GetClassLong(hwnd,GCL\u HICON) 如果图标\u句柄==0: 返回设置。空白\u图标 说下

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

来自win32con GCL\u HICON,WM\u GETICON,
从win32gui导入GetClassLong,SendMessageTimeout
_,icon_handle=SendMessageTimeout(hwnd,WM_GETICON,1,0,0,50)
如果图标\u句柄==0:
icon\u handle=GetClassLong(hwnd,GCL\u HICON)
如果图标\u句柄==0:
返回设置。空白\u图标
说下一步应该使用LoadIcon/LoadImage从可执行文件中提取它,但我试图避免这样做

说UWP应用程序图标路径可以通过(
ctypes.windell.shlwapi.SHLoadIndirectString
从Python中检索),但该主题涉及注册表中找到的文件关联-打开的窗口不是起点

如何检索只有窗口句柄的“间接字符串”?或者有人知道这个问题的其他解决方案,我对我能得到的任何类型的图标/图像都感兴趣


编辑:已接受的答案以及使用Python和ctypes解决此问题的方法。

对于
UWP
应用程序,图标不止一个,可能有很多,以便能够适应特定的设备、形状因素等

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

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

这些API是本机API,因此据我所知,它们在.NET框架中没有等效的API。但是,它们可以通过WinRT应用程序进行访问(您确实可以通过标准的.NET Framework应用程序访问一些WinRT API,但这有点像黑客)

这些应用程序中包含的图像是特殊的,因为它们被定义为资源(资产)键,可以使用限定符进行调整以形成最终路径。这里有文档记录,例如here:和here:Quickstart:

问题是,您可以找到的内容在很大程度上取决于应用程序本身,因此确定您可以使用的映像并不十分容易,而且我还没有找到任何用于此目的的API,因此我编写了一个示例,以获取给定资源名的最高比例映像作为示例(
findhestscalequalifiedimagepath
)。您可以从此路径加载WPF位图源(或任何其他成像平台资源)

样本包含在提供的链接中。有关详情,请参阅:


该类可能没有图标,请尝试WM_GETICON。不确定我是否理解您的意思,GetClassLong随后会运行-如果我使用
win32api.SendMessage(hwnd,WM_GETICON,TYPE,0)
类型为0,1或2中的任何一个,我仍然会收到0。非常感谢您的回答,在结合了其中两个答案和一些谷歌搜索之后,我开始得到一些结果(GetPackageFullName可以通过
ctypes.windell.kernel32.GetPackageFullName
从Python访问)。当我得到代码时,我会在这里发布。再次感谢@伊帕莱卡我很荣幸能帮助你。我接受了你的回答,因为这是解决这个问题的方法。后来我又问了一个问题,得到了回答。