Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Получить индекс иконки


Автор: N1ko 6.11.2009, 15:27
Ребят, провозился с данной проблемой уже 5 дней. Потерял уже какую либо надежду на получение желанного результата. КТО НИБУТЬ, ПОМОГИТЕ ПЛЗ...Вот проблема...
Я вытаскиваю иконки из файла или папки при помощи WinApi из Shell32.dll посредством функции SHGetFileInfo и вставляю иконки в ImageList(C#). Собственно интересует как достать индекс(порядковый номер) иконки в системном ImageList, дабы сверять присутствует ли таковая в ImageList? Или предложите какой нить другой вариант как определить, вставлял ли я иконку уже в созданный мной ImageList или нет. А если вставлял то обратиться по такому то индексу в ImageList. Если есть возможность, напишите код...

Вот один из многих вариантов кода, который также успешно не работает должным образом, как и другие

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms;
namespace IconObtainer
{
    class IconReceiver
    {
#region Variable List
        public const uint SHGFI_ICONLOCATION = 0x000001000; 
        private const uint SHGFI_ICON = 0x100;
        public const uint SHGFI_SYSICONINDEX = 0x000004000;     // get system icon index
        private const uint SHGFI_SMALLICON = 0x1;
        public SHFILEINFO IconContainer;
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public int iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        };

#endregion

        [DllImport("shell32.dll", CharSet = CharSet.Auto)]
        private static extern void SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags);
        public int GetIcon(string FilePath)
        {
            IconContainer = new SHFILEINFO();
            SHGetFileInfo(FilePath, 0, ref IconContainer, (uint)Marshal.SizeOf(IconContainer), SHGFI_ICONLOCATION);
           // Icon CurIcon = (Icon)Icon.FromHandle(IconContainer.hIcon);
            MessageBox.Show(IconContainer.iIcon.ToString());
            return IconContainer.iIcon;//Постоянно выдаёт  0 3 или 8 в зависимости от путя к файлу, который я указываю . Больше ничего...
        }
    }
}
 

Автор: N1ko 10.11.2009, 17:09
Что вообще никто не знает как это сделать? (((

Автор: Lunatic2009 11.11.2009, 06:07
Все, что пришло в голову - сделать так:

Код

Icon ico = Icon.FromHandle(shinfo.hIcon);
int imgIndex = imageList1.Images.IndexOfKey(openFileDialog1.FileName);

if (imgIndex != -1)
{
     listView1.Items.Add(openFileDialog1.FileName, imgIndex);
}
else
{
     imageList1.Images.Add(openFileDialog1.FileName, ico);
     listView1.Items.Add(openFileDialog1.FileName, imageList1.Images.Count - 1);
}

Автор: N1ko 15.11.2009, 01:53
Вся проблема в том, что ты здесь добавляешь в ImageList путь к файлу, мне нужно передать в него иконку данного файла. То есть в твоём случае ты проверяешь в листе наличие иконки файла по заданому пути, а мне нужно проверять наличие иконки определённого вида файла. То есть исходя из написаного кода в ImageList может находиться много пунктов, которые указывают на папку. Ты немного неправильно понял проблемы. 


Автор: N1ko 20.11.2009, 15:09
Можно ли определить адрес на жёстком диске, по кторому находится иконка в shell.dll. то есть таким образом я смог бы сравнивать иконки, проверяя не совпадают ли их адреса. Прихожу к таким крайностям, поскольку никак не могу решить выше описаную проблему, разве что только попиксельным сравнением каждой мконки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)