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

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

如果对LoadIcon的明显调用没有这样做,我如何获得第二个图标?
发布于 2017-06-23 12:07:02
这感觉就像user32.dll中的一个bug,但是Windows 8也有同样的问题,所以我想微软并不在意。
您可以通过调用MessageBox来获取SHGetStockIconInfo使用的平面图标
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,但您不应该假设情况是这样的.
发布于 2017-06-23 11:41:37
我们可以尝试下一个测试/演示代码。
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")
https://stackoverflow.com/questions/44718680
复制相似问题