如何从hWnd获取Windows应用商店应用图标?

时间:2015-08-14 02:03:17

标签: c# windows process sendmessage user32

我目前在C#Windows应用程序中使用WM_GETICON消息来获取与hWnd相关联的图标,但它不会为我提供ApplicationFrameHost的图标(Windows Store应用商店) )进程(这是有道理的,因为它隐藏了实际的应用程序)。

以下是我目前使用的代码,适用于“普通”应用:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);

public static IntPtr GetAppIcon(IntPtr hwnd)
{
    var iconHandle = SendMessage(hwnd, WM_GETICON, ICON_BIG, 0);
    if (iconHandle == IntPtr.Zero)
        iconHandle = SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0);
    if (iconHandle == IntPtr.Zero)
        iconHandle = SendMessage(hwnd, WM_GETICON, ICON_SMALL2, 0);
        return iconHandle;
}

获取ApplicationFrameHost.exe图标对我没有帮助。似乎这样的图标,因为a)我可以在任务栏中看到它,b)我也可以在任务管理器中看到它。

我如何获得此图标?

1 个答案:

答案 0 :(得分:1)

今天没有好的答案。

您需要确定应用程序的身份。有关详情,请参阅您的其他帖子=> How to get the "Application Name" from hWnd for Windows 10 Store Apps (e.g. Edge)

完成后,您可以使用PackageManager.FindPackage(pkgfullname)获取Windows.ApplicationModel.Package,然后使用Package.GetAppListEntriesAsync获取AppListEntry对象的列表,包中的每个应用程序1个。对于每个,请使用.DisplayInfo.DisplayName,.Description和.GetLogo()。

https://msdn.microsoft.com/en-us/library/windows/apps/windows.applicationmodel.package.getapplistentriesasync.aspx

警告:这会给多应用程序包(MAP)带来问题,因为您在程序包中有多个应用程序。您无法直接查询应用程序的AppListEntry,也无法告知AppListEntry的应用程序标识。您知道该流程的AUMID = 1,但GetAppListEntriesAsync()可能会返回4个值的列表,但您无法确定您要查找的是哪个。