黄色蓝色盾牌图标的存储位置

Der*_*ler 9 windows icons uac

在Windows中,这是什么 黄蓝色Windows安全图标图标存储?我需要在XP的TaskDialog仿真中使用它,并且很难跟踪它.

它不在shell32.dll,explorer.exe,ieframe.dll或wmploc.dll中(因为它们包含Windows中常用的很多图标).

编辑:为了澄清,我在XP中模拟某种类型的对话框.该图标(很可能)不存在.因此,我想从在Windows 7中保存它的库中提取它.我正在扩展此仿真的现有实现,并希望提供完整的功能集.

Mic*_*tta 10

屏蔽图标位于文件中C:\Windows\System32\imageres.dll(至少在我的英文版32位Windows 7中).这里有几个版本的盾牌图标,包括你上面的蓝色和黄色版本(图标78).


Ian*_*oyd 10

我想明确指出它.

应该在触发高程的UI元素上放置一个屏蔽:MSDN:步骤4:重新设计用于UAC兼容性的UI.

当然,你不要去探洞周围DLL文件中提取图像(虽然它的确使它更容易在设计的时候,你可以用设计时界面设计你的设计).

Microsoft提供了一些支持(因此保证)的方法,您可以在运行时获得屏蔽图标:

文章忘了提到LoadIcon:

hIconShield = LoadIcon(0, IDI_SHIELD);
Run Code Online (Sandbox Code Playgroud)

虽然LoadIcon已经被"取代"了LoadImage:

hIconShield = LoadImage(0, IDI_SHIELD, IMAGE_ICON, desiredWith, desiredHeight, LR_SHARED); //passing LR_SHARED causes size to be ignored. And you must pass LR_SHARED
Run Code Online (Sandbox Code Playgroud)

加载您想要的大小 - 避免共享图像

为了避免加载图标的"共享"版本,您必须直接从文件中加载图标.

我们都知道盾牌存在于user32.dll资源ID中106:

| 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              |
Run Code Online (Sandbox Code Playgroud)

这是无证的拼写.

SHGetStockIconInfo可以为我们提供实际的,当前的,保证在未来,路径和索引中的变化:

TSHStockIconInfo sii;
ZeroMemory(@sii, SizeOf(sii));
sii.cbSize := SizeOf(sii);
SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICONLOCATION, {var}sii);
Run Code Online (Sandbox Code Playgroud)

导致:

  • sii.szPath:C:\WINDOWS\System32\imageres.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);
Run Code Online (Sandbox Code Playgroud)

另一种稍微简单的方法是使用SHDefExtractIcon:

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;
}
Run Code Online (Sandbox Code Playgroud)

它为您完成加载,它处理负图标索引(以及具有的秘密含义):

HICON shieldIcon = GetStockIcon(SIID_SHIELD, 256);
Run Code Online (Sandbox Code Playgroud)

就个人而言,我然后使用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;
}
Run Code Online (Sandbox Code Playgroud)

所以:

IWICBitmap bmp = GetStockWicBitmap(SIID_SHIELD, 256);
Run Code Online (Sandbox Code Playgroud)

现在您已经拥有了位图,在运行时,可以根据需要使用它.

小而大

问题ExtractIconEx是你再次坚持使用两种外壳尺寸:

  • "小"(即GetSystemMetrics(SM_CXSMICON))
  • "大"(即GetSystemMetrics(SM_CXICON))

加载图标在Windows中是一种非常黑暗的艺术:

  • LoadIcon
  • 的LoadImage
  • LoadImage(...,LR_SHARED)
  • ExtractIcon
  • ExtractIconEx
  • IExtractImage
  • SHDefExtractIcon
  • SHGetFileInfo(...,SHGFI_ICON,...);
  • SHGetFileInfo(...,SHGFI_SYSICONINDEX,...);
  • SHGetFileInfo(...,SHGFI_ICONLOCATION,...);
  • IThumbnailProvider

通过SHGetStockIconInfo提供的图标

Microsoft提供了一个方便的页面,给出了所有股票图标的示例和描述.

和256px盾牌图标(从Windows 10开始):

在此输入图像描述