在Windows中,是否存储了此图标?我需要在XP的TaskDialog仿真中使用它,并且很难跟踪它。
它不在shell32.dll,explorer.exe,ieframe.dll或wmploc.dll中(因为它们包含Windows中常用的很多图标)。
编辑: 为了澄清,我在XP中模仿certain type of dialog。该图标(很可能)不存在。所以我想从在Windows 7中保存它的库中提取它。我正在扩展这个模拟的existing implementation并希望提供一个完整的功能集。
答案 0 :(得分:10)
屏蔽图标位于文件C:\Windows\System32\imageres.dll
中(至少在我的英文版32位Windows 7中)。这里有几个版本的盾牌图标,包括你上面的蓝色和黄色版本(图标78)。
答案 1 :(得分:10)
我想明确指出。
您假设将 shield 放在将触发提升的UI元素上:MSDN: Step 4: Redesign Your UI for UAC Compatibility。
当然,你没有 去探索DLL来提取图像(尽管在设计时你需要设计你的设计的时候它确实能让你更容易)。
Microsoft提供了一些支持(因此保证)的方法,您可以在运行时获得屏蔽图标:
Add a shield icon to the user interface?:
提取小图标
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. ...);
Button_SetElevationRequiredState(hwndButton, TRUE);
文章忘了提及LoadIcon
:
hIconShield = LoadIcon(0, IDI_SHIELD);
虽然 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
为了避免加载图标的"共享" 版本,您必须直接从文件中加载图标。
我们都知道盾牌存在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 |
那是无证件的拼写。
SHGetStockIconInfo 可以为我们提供实际的,当前的,保证将来的变化,路径和指数:
TSHStockIconInfo sii;
ZeroMemory(@sii, SizeOf(sii));
sii.cbSize := SizeOf(sii);
SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICONLOCATION, {var}sii);
导致:
C:\WINDOWS\System32\imageres.dll
-78
您可以使用LoadImage
HMODULE hmod := LoadLibrary(sii.szPath);
Integer nIconIndex := Abs(sii.iIcon); //-78 --> 78
ico = LoadImage(hmod, MAKEINTRESOURCE(nIconIndex), IMAGE_ICON, 256, 256, 0);
另一种稍微简单的方法是使用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;
}
它为您执行加载,并处理负图标索引(and the secret meaning that has):
HICON shieldIcon = GetStockIcon(SIID_SHIELD, 256);
就个人而言,我然后使用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_CXSMICON)
)GetSystemMetrics(SM_CXICON)
)加载图标是quite a dark art in Windows:
Microsoft提供了一个方便的页面,其中提供了所有股票图标的示例和描述。
256px盾牌图标(从Windows 10开始):
答案 2 :(得分:1)
从Windows 7 x64 SP1中提取的图标英文:
16x16盾牌图标:
24x24盾牌图标:
32x32盾牌图标:
答案 3 :(得分:0)
你问的是错误的问题。在任何版本的Windows上存储此图标无关紧要。如果微软没有告诉你那么你就不应该使用它 - 它可能不会出现在Windows 8中(或7之后的任何内容)。
如果你想让图标变得如此糟糕,那么在这个问题上面就有一个像样的图形表示。您可以执行alt-prt scrn然后使用您喜欢的图形应用程序将其转换为图标并将其添加到您的应用程序。这可能不合法(记住,IANAL)