Windows 黄蓝盾图标的存储位置
在Windows中,此图标存储在何处?我需要在TaskDialog XP仿真中使用它,我很难找到它 它不在shell32.dll、explorer.exe、ieframe.dll或wmploc.dll中(因为它们包含许多在Windows中常用的图标) 编辑:Windows 黄蓝盾图标的存储位置,windows,icons,uac,Windows,Icons,Uac,在Windows中,此图标存储在何处?我需要在TaskDialog XP仿真中使用它,我很难找到它 它不在shell32.dll、explorer.exe、ieframe.dll或wmploc.dll中(因为它们包含许多在Windows中常用的图标) 编辑: 为了澄清这一点,我正在XP中模拟一个。图标(很可能)不在那里。所以我想从Windows7中保存它的库中提取它。我正在扩展此模拟的功能,并希望提供完整的功能集。您问的问题不对。在任何版本的windows上,此图标存储在何处都无关紧要。如果微软
为了澄清这一点,我正在XP中模拟一个。图标(很可能)不在那里。所以我想从Windows7中保存它的库中提取它。我正在扩展此模拟的功能,并希望提供完整的功能集。您问的问题不对。在任何版本的windows上,此图标存储在何处都无关紧要。如果微软不告诉你,那么你就不应该使用它——它可能在Windows8中不存在(或者在Windows7之后出现的任何东西)
如果你非常想要这个图标,在这个问题上面有一个不错的图形表示。你可以做alt prt scrn,然后使用你最喜欢的图形应用程序将其变成一个图标,并将其添加到你的应用程序中。但这可能是不合法的(记住,IANAL)屏蔽图标位于文件
C:\Windows\System32\imageres.dll
(至少在我的英文32位Windows 7副本中)。这里有几个版本的屏蔽图标,包括上面的蓝色和黄色版本(图标78)。从Windows 7 x64 SP1中提取的图标英文版:
16x16屏蔽图标:
24x24屏蔽图标:
32x32屏蔽图标:我想明确指出它 您应该在UI元素上放置一个屏蔽,该屏蔽将触发提升: 当然,您不必四处探索DLL来提取图像(尽管当您可以使用设计时界面设计您的设计时,这确实会使设计时更容易) Microsoft提供了两种受支持的(因此是有保证的)方式,您可以在运行时获得shield图标:
- :
- 提取一个小图标
SHSTOCKICONINFO sii; sii.cbSize = sizeof(sii); SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON | SHGSI_SMALLICON, &sii); hiconShield = sii.hIcon;
- 提取一个大图标
SHSTOCKICONINFO sii; sii.cbSize = sizeof(sii); SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON | SHGSI_LARGEICON, &sii); hiconShield = sii.hIcon;
- 提取自定义大小的图标
SHSTOCKICONINFO sii; sii.cbSize = sizeof(sii); SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICONLOCATION, &sii); hiconShield = ExtractIconEx(sii. ...);
- 提取一个小图标
106
的形式存在于user32.dll中:
| Icon | Standard Icon ID | Real Resource ID |
|------------------|-------------------|------------------|
| IDI_APPLICATION | 32512 | 100 |
| IDI_QUESTION | 32514 | 102 |
| IDI_WINLOGO | 32517 | 105 |
| IDI_WARNING | 32515 | 101 |
| IDI_ERROR | 32513 | 103 |
| IDI_INFORMATION | 32516 | 104 |
| IDI_SHIELD | 32518 | 106 |
那是非法的拼写
SHGetStockIconInfo可以为我们提供实际的、当前的、保证在未来发生变化的路径和索引:
TSHStockIconInfo sii;
ZeroMemory(@sii, SizeOf(sii));
sii.cbSize := SizeOf(sii);
SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICONLOCATION, {var}sii);
导致:
- sii.szPath:
C:\WINDOWS\System32\imagers.dll
- sii.iIcon:
-78
您可以使用LoadImage
按所需大小加载此图像:
HMODULE hmod := LoadLibrary(sii.szPath);
Integer nIconIndex := Abs(sii.iIcon); //-78 --> 78
ico = LoadImage(hmod, MAKEINTRESOURCE(nIconIndex), IMAGE_ICON, 256, 256, 0);
另一个稍微简单的方法是使用shdeftracticon
:
HICON GetStockIcon(DWORD StockIconID, Integer IconSize)
{
HRESULT hr;
TSHStockIconInfo sii;
ZeroMemory(@sii, SizeOf(sii));
sii.cbSize := SizeOf(sii);
hr = SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICONLOCATION, {var}sii);
OleCheck(hr);
HICON ico;
hr = SHDefExtractIcon(sii.szPath, sii.iIcon, 0, ref ico, null, IconSize);
OleCheck(hr);
return ico;
}
它为您进行加载,并处理负图标索引():
就我个人而言,我随后使用WIC将其包装成IWICBitmap:
IWICBitmap GetStockWicBitmap(DWORD StockIconID, Integer IconSize)
{
HICON ico = GetStockIcon(StockIconID, IconSize);
IWICBitmap bitmap;
IWICImagingFactory factory = new WICImagingFactory();
HRESULT hr = factory.CreateBitmapFromHICON(ico, out bitmap);
OleCheck(hr);
return bitmap;
}
因此:
IWICBitmap bmp = GetStockWicBitmap(SIID_SHIELD, 256);
现在您已经有了位图,在运行时,可以随心所欲地使用它
大大小小
ExtractIconEx
的问题是,您再次被两种外壳尺寸所困扰:
- “小”(即
GetSystemMetrics(SM\u CXSMICON)
)
- “大型”(即
GetSystemMetrics(SM_CXICON)
)
加载图标是指:
- 加载图标
- 加载映像
- LoadImage(…,LR_共享)
- 提取器图标
- ExtractIconEx
- 电子提取图像
- SHDefExtractIcon
- SHGetFileInfo(…,SHGFI_图标,…)李>
- SHGetFileInfo(…,SHGFI_SYSICONINDEX,…)李>
- SHGetFileInfo(…,SHGFI_图标位置,…)李>
- IThumbnailProvider
通过SHGetStockIconInfo提供图标
微软提供了一个方便的页面,其中给出了所有股票图标的示例和说明
- ()
和256px屏蔽图标(从Windows 10开始):
这是UAC指示器,不是吗?我不认为它会出现在XP中,只有Vista和7。该图标被操作系统用于用户可以信任的东西-为什么要显示它?@Stewart该图标不是为操作系统保留的,应用程序也应该使用它():“当软件运行时,您可以使用但不共享其图标、图像、声音和媒体。”在继续之前咨询律师。@IanBoyd:谢谢你指出这一点!多年来,我一直在使用系统DLL中的MAKEINTRESOURCE,我意识到必须有一种正确的方法来做到这一点,即尊重主题等等;)正如我在问题中所说的,我试图在一个Windows版本中模拟TaskDialogs(使用此图标),而这个Windows版本既没有也没有。我原来帖子中的图片实际上是一个截图。所以它没有alpha通道(我需要它来模拟这个特性)。在XP之后,我使用官方API,所以我并不关心图标在未来版本中的外观。我希望那些不想花30分钟(找到合适的资源提取器,然后将图标提取为合适的24位PNG图像)的人会发现这很有用。这不是我所说的图标。快速问题:是吗“实际、当前、保证将来更改、路径和索引”指的是应用程序运行时的“未来”,或是Windows未来版本中的“未来”?Windows未来版本中的“未来”。这是API合同的一部分,Microsoft非常重视向后兼容性。
HICON GetStockIcon(DWORD StockIconID, Integer IconSize)
{
HRESULT hr;
TSHStockIconInfo sii;
ZeroMemory(@sii, SizeOf(sii));
sii.cbSize := SizeOf(sii);
hr = SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICONLOCATION, {var}sii);
OleCheck(hr);
HICON ico;
hr = SHDefExtractIcon(sii.szPath, sii.iIcon, 0, ref ico, null, IconSize);
OleCheck(hr);
return ico;
}
HICON shieldIcon = GetStockIcon(SIID_SHIELD, 256);
IWICBitmap GetStockWicBitmap(DWORD StockIconID, Integer IconSize)
{
HICON ico = GetStockIcon(StockIconID, IconSize);
IWICBitmap bitmap;
IWICImagingFactory factory = new WICImagingFactory();
HRESULT hr = factory.CreateBitmapFromHICON(ico, out bitmap);
OleCheck(hr);
return bitmap;
}
IWICBitmap bmp = GetStockWicBitmap(SIID_SHIELD, 256);