Мне нужно программно найти значок по умолчанию для исполняемого файла Windows (PE-файл = dll, exe, com ..). Я знаю, как пройтись по ресурсам и определить, что такое значок, что такое курсор и т. Д., Но, насколько мне известно, ни один из значков никоим образом не помечен как значок по умолчанию. Итак, кто-нибудь знает, как найти значок по умолчанию? Более того, я не хочу использовать какой-либо вызов API Windows, я хочу сам кодировать функцию. Проблема в том, что я не знаю, какой из всех значков является значком по умолчанию.
Как найти значок по умолчанию в ресурсах исполняемого файла?
Ответы (2)
После долгих поисков я обнаружил, что значок по умолчанию не тот, у которого самый низкий идентификатор.
Windows использует несколько размеров одного значка для разных вещей. Дополнительную информацию см. здесь, но короче вот важная информация:
Когда система отображает значок, она должна извлечь соответствующее изображение значка из файла .exe или .dll. Система использует следующие шаги для выбора изображения значка:
Выберите ресурс RT_GROUP_ICON. Если существует более одного такого ресурса, система использует первый ресурс, указанный в сценарии ресурса.
Выберите соответствующее изображение RT_ICON из ресурса RT_GROUP_ICON. Если существует более одного изображения, система использует следующие критерии для выбора изображения:
Выбирается изображение, наиболее близкое к запрошенному размеру.
Если присутствуют два или более изображения такого размера, выбирается то, которое соответствует глубине цвета дисплея.
Если нет изображений, точно соответствующих глубине цвета дисплея, выбирается изображение с наибольшей глубиной цвета, не превышающей глубину цвета дисплея. Если все цвета превышают глубину цвета, выбирается тот, у которого самая низкая глубина цвета.
Примечание. Система рассматривает все значения глубины цвета 8 и более бит на пиксель как равные. Следовательно, нет преимущества включения 256-цветного изображения 16x16 и 16-цветного изображения 16x16 в один и тот же ресурс - система просто выберет первое, с которым столкнется. Когда дисплей находится в режиме 8-бит на пиксель, система выберет 16-цветной значок вместо 256-цветного и отобразит все значки с использованием палитры по умолчанию.
Поскольку запрошенный размер составляет 16x16 (потому что это системный маленький размер значка, т. Е. Размер значка по умолчанию), я думаю, мы можем сказать, что значок по умолчанию - это значок из первой группы значков, который имеет наименьший размер (не меньше значок, чем может существовать 16x16) с максимальной глубиной цвета.
РЕДАКТИРОВАТЬ: небольшое исправление. Значок размером меньше 16x16, очевидно, может находиться в ресурсах, но это указывает на то, что файл не имеет значка по умолчанию, и система вместо этого предоставляет свой собственный значок.
Первый, который вы найдете, будет выбран по умолчанию.
Значок по умолчанию - это просто значок с наименьшим идентификатором, поэтому по определению это первый значок, обнаруженный при перечислении ресурсов.