Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 黄蓝盾图标的存储位置_Windows_Icons_Uac - Fatal编程技术网

Windows 黄蓝盾图标的存储位置

Windows 黄蓝盾图标的存储位置,windows,icons,uac,Windows,Icons,Uac,在Windows中,此图标存储在何处?我需要在TaskDialog XP仿真中使用它,我很难找到它 它不在shell32.dll、explorer.exe、ieframe.dll或wmploc.dll中(因为它们包含许多在Windows中常用的图标) 编辑: 为了澄清这一点,我正在XP中模拟一个。图标(很可能)不在那里。所以我想从Windows7中保存它的库中提取它。我正在扩展此模拟的功能,并希望提供完整的功能集。您问的问题不对。在任何版本的windows上,此图标存储在何处都无关紧要。如果微软

在Windows中,此图标存储在何处?我需要在TaskDialog XP仿真中使用它,我很难找到它

它不在shell32.dll、explorer.exe、ieframe.dll或wmploc.dll中(因为它们包含许多在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. ...);
      
这篇文章忘了提到:

尽管加载图标已被以下内容“取代”:

加载所需大小-通过避免共享图像 为了避免加载图标的“共享”版本,必须直接从文件中加载图标

我们都知道屏蔽以资源id
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);