【问题标题】:How to get the Windows Store App icon from a hWnd?如何从 hWnd 获取 Windows Store App 图标?
【发布时间】:2015-11-07 04:30:50
【问题描述】:

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

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

[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)我也可以在任务管理器中看到它。

我怎样才能得到这个图标?

【问题讨论】:

    标签: c# windows process sendmessage user32


    【解决方案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 个值的列表,您将无法确定要查找的值。

    【讨论】:

    • 谢谢!至于 AUMID ID,我在哪里可以找到?在 AppListEntry 对象上?
    • 另外,当我调用FindPackageForUser(string.Empty, process.MainModule.ModuleName) 时,它返回null。关于如何解决这个问题的任何想法?
    • process.MainModule.ModuleName = C# System.Diagnostics.Process.MainModule.ModuleName,GetModuleFileName 的 C# 等效项。您正在调用 FindPackageForUser 并将其作为 packageFullName (由于 E_INVALIDARG 应该会失败,但可能只是找不到匹配项并返回一个空列表)。 AppListEntry 在 1709 年获得了 AppUserModelId 属性,如果您不需要在旧版 Windows 上运行,则可以更轻松地区分包中的多个应用程序。
    猜你喜欢
    • 2015-10-06
    • 2011-08-02
    • 1970-01-01
    • 2011-07-19
    • 2013-10-31
    • 2011-08-02
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多