Mic*_*tta 10
屏蔽图标位于文件中C:\Windows\System32\imageres.dll(至少在我的英文版32位Windows 7中).这里有几个版本的盾牌图标,包括你上面的蓝色和黄色版本(图标78).
Ian*_*oyd 10
我想明确指出它.
您应该在触发高程的UI元素上放置一个屏蔽:MSDN:步骤4:重新设计用于UAC兼容性的UI.
当然,你不要有去探洞周围DLL文件中提取图像(虽然它的确使它更容易在设计的时候,你可以用设计时界面设计你的设计).
Microsoft提供了一些支持(因此保证)的方法,您可以在运行时获得屏蔽图标:
提取一个小图标
SHSTOCKICONINFO sii;
sii.cbSize = sizeof(sii);
SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON | SHGSI_SMALLICON, &sii);
hiconShield = sii.hIcon;
Run Code Online (Sandbox Code Playgroud)提取一个大图标
SHSTOCKICONINFO sii;
sii.cbSize = sizeof(sii);
SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICON | SHGSI_LARGEICON, &sii);
hiconShield = sii.hIcon;
Run Code Online (Sandbox Code Playgroud)提取自定义大小的图标
SHSTOCKICONINFO sii;
sii.cbSize = sizeof(sii);
SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICONLOCATION, &sii);
hiconShield = ExtractIconEx(sii. ...);
Run Code Online (Sandbox Code Playgroud)Button_SetElevationRequiredState(hwndButton, TRUE);
Run Code Online (Sandbox Code Playgroud)文章忘了提到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)
导致:
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);
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))Microsoft提供了一个方便的页面,给出了所有股票图标的示例和描述.
和256px盾牌图标(从Windows 10开始):
| 归档时间: |
|
| 查看次数: |
3801 次 |
| 最近记录: |