首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何加载与Windows 10上MessageBox使用的图标相同的图标?

如何加载与Windows 10上MessageBox使用的图标相同的图标?
EN

Stack Overflow用户
提问于 2017-06-23 10:04:28
回答 2查看 1.1K关注 0票数 5

在Windows 10上,调用LoadIcon请求标准图标IDI_INFORMATION会产生这个图标:

另一方面,调用传递MessageBoxIDI_INFORMATION会生成一个使用此图标的对话框:

如果对LoadIcon的明显调用没有这样做,我如何获得第二个图标?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-23 12:07:02

这感觉就像user32.dll中的一个bug,但是Windows 8也有同样的问题,所以我想微软并不在意。

您可以通过调用MessageBox来获取SHGetStockIconInfo使用的平面图标

代码语言:javascript
复制
SHSTOCKICONINFO sii;
sii.cbSize = sizeof(sii);
if (SUCCEEDED(SHGetStockIconInfo(SIID_INFO, SHGSI_ICON|SHGSI_LARGEICON, &sii)))
{
    // Use sii.hIcon here...
    DestroyIcon(sii.hIcon);
}

SHGetStockIconInfo是在Vista和更高版本的Windows中使用图标的一种记录。大多数图标来自imageres.dll,但您不应该假设情况是这样的.

票数 4
EN

Stack Overflow用户

发布于 2017-06-23 11:41:37

我们可以尝试下一个测试/演示代码。

代码语言:javascript
复制
    MSGBOXPARAMSW mbi = { 
        sizeof(mbi), 
        HWND_DESKTOP, 
        NULL,
        L"lpszText",
        L"lpszCaption",
        MB_USERICON,
        IDI_INFORMATION
    };
    MessageBoxIndirectW(&mbi);

    if (HMODULE hmodImageRes = LoadLibraryEx(L"imageres", 0, LOAD_LIBRARY_AS_DATAFILE))
    {
        mbi.hInstance = hmodImageRes;
        mbi.lpszIcon = MAKEINTRESOURCE(81);
        MessageBoxIndirectW(&mbi);
        FreeLibrary(hmodImageRes);
    }

第一个消息框使用标准的IDI_INFORMATION图标

当在windows 7上第二个相同的图标时,

在windows 8.1和windows 10上。

来自imageres.dll的MAKEINTRESOURCE(81)是否有某种记录并且是稳定的-我怀疑

因此,可以通过LoadIcon(hmodImageRes, MAKEINTRESOURCE(81))获得第二个图标,其中HMODULE hmodImageRes = LoadLibraryEx(L"imageres", 0, LOAD_LIBRARY_AS_DATAFILE)或简单的LoadLibrary(L"imageres")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44718680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档