Место хранения желто-синего значка экрана
где, в Windows, это хранить? Мне нужно использовать его в эмуляции TaskDialog для XP, и мне трудно его отслеживать.
Это не в заshell32.dll, explorer.exe, ieframe.dll или wmploc.dll (поскольку они содержат много значков, обычно используемых в Windows).
изменить: Для уточнения, я подражаю определенный тип диалога в XP. Значок (скорее всего) отсутствует. Поэтому я хочу извлечь его из библиотеки, которая содержит это в Windows 7. Я расширяю применение этой эмуляции и хотите предоставить полный набор функций.
4 ответов
я хотел указать на это в явном виде.
вы должно поставить щит на элементах пользовательского интерфейса, которые вызовут высоту:MSDN: Шаг 4: редизайн пользовательского интерфейса для совместимости с UAC.
конечно, вы не есть чтобы пойти spelunking вокруг DLL для извлечения изображений (хотя это, безусловно, делает его проще во время разработки, когда вы можете создать свой дизайн со временем разработки взаимодействие.)
Microsoft предоставляет несколько поддерживаемых (и, следовательно, гарантированных) способов, которыми вы можете получить значок экрана во время выполнения:
-
добавить значок экрана в пользовательский интерфейс?:
-
извлечь небольшой значок
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
как идентификатор ресурса 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 |
, который был без документов spellunking.
SHGetStockIconInfo может дать нам фактическое, текущее, гарантированное изменение в будущем, путь и индекс:
TSHStockIconInfo sii;
ZeroMemory(@sii, SizeOf(sii));
sii.cbSize := SizeOf(sii);
SHGetStockIconInfo(SIID_SHIELD, SHGSI_ICONLOCATION, {var}sii);
в результате в:
-
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);
еще один немного более простой способ-использовать 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;
}
он выполняет загрузку для вас, и он обрабатывает отрицательный индекс значка (и тайный смысл, который имеет):
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)
)
загрузка значков что-то, что довольно темное искусство в 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):
значок щита находится в файле C:\Windows\System32\imageres.dll
(по крайней мере, в моей копии английской 32-битной Windows 7). Там есть несколько версий значка щита, включая синюю и желтую версии, которые у вас есть выше (значок 78).
значки, извлеченные из Windows 7 x64 SP1 English:
16x16 значок щита:
24x24 значок щита:
32x32 значок щита:
вы задаете неправильный вопрос. Не имеет значения, где этот значок хранится в любой версии windows. Если Microsoft не скажет вам, вы не должны использовать его - его может не быть в windows 8 (или что-то после 7).
Если вы хотите значок так плохо, есть достойное графическое представление его выше в этом вопросе. Вы можете сделать Alt-prt scrn, а затем использовать свое любимое графическое приложение, чтобы превратить его в значок и добавить его в приложение. Это может быть не законно, хотя (помни, ИАНАЛ)