Получить иконку, ассоциированную с типом файла.
От: Spaider Верблюд  
Дата: 10.06.03 11:05
Оценка: 1 (1)
Как мне в .NET'е получить иконку, ассоциированную с типом файла?

На Дельфях это выглядит вот так
procedure TForm1.FormCreate(Sender: TObject);
Var
  SFI : TSHFileInfo;
begin
  SmallSysImages.Handle:=SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
  LargeSysImages.Handle:=SHGetFileInfo('', 0, SFI, SizeOf(SFI), SHGFI_SYSICONINDEX or SHGFI_ICON);
end;

...
 SHGetFileInfo (PChar(FName), 0, SFI, SizeOf (TSHFileInfo), SHGFI_SYSICONINDEX or SHGFI_SMALLICON or SHGFI_USEFILEATTRIBUTES);
 LI.ImageIndex:=SFI.iIcon;
...


В .NET'е ImageList.Handle только для чтения, что, в общем-то, понятно
... << RSDN@Home 1.0 beta 6a >>

23.12.03 17:04: Перенесено модератором из '.NET' — AVK
--
К вашим услугам,
Re: Получить иконку, ассоциированную с типом файла.
От: shapkin Великобритания  
Дата: 10.06.03 11:35
Оценка: 3 (1)
Здравствуйте, Spaider, Вы писали:

S>Как мне в .NET'е получить иконку, ассоциированную с типом файла?


HOW TO: Use the SHGetFileInfo Function to Get the Icons That Are Associated with Files in Visual C# .NET
... << RSDN@Home 1.0 beta 6a >>
Re: Получить иконку, ассоциированную с типом файла.
От: Spark2K Россия  
Дата: 10.06.03 11:46
Оценка:
Здравствуйте, Spaider, Вы писали:

S>Как мне в .NET'е получить иконку, ассоциированную с типом файла?


Вот, кажется, все, что надо:

private Icon GetIconFromShell(string ext, bool isLargeIcon)
{
    SHFILEINFO fileInfo = new SHFILEINFO();
    if(!isLargeIcon)
        SHGetFileInfo(ext, FileAttributes.FILE_ATTRIBUTE_NORMAL, out fileInfo,
            (uint)20, ShellFileInfoFlags.SHGFI_USEFILEATTRIBUTES | ShellFileInfoFlags.SHGFI_ICON | ShellFileInfoFlags.SHGFI_SMALLICON);
    else
        SHGetFileInfo(ext, FileAttributes.FILE_ATTRIBUTE_NORMAL, out fileInfo,
            (uint)20, ShellFileInfoFlags.SHGFI_USEFILEATTRIBUTES | ShellFileInfoFlags.SHGFI_ICON);
    if(fileInfo.hIcon == (IntPtr)0)  return null;
    return Icon.FromHandle(fileInfo.hIcon);
}

private struct SHFILEINFO
{
    public IntPtr hIcon;             // дескриптор системной иконки.
    public int iIcon;                // индекс системной иконки в коллекции системных иконок.
    public uint dwAttributes;        // атрибуты файла.
    public string szDisplayName;     // отображаемое имя файла.
    public string szTypeName;        // наименование типа файла.
}

public enum FileAttributes
{
    FILE_ATTRIBUTE_DIRECTORY   = 0x00000010,     // каталог.
    FILE_ATTRIBUTE_NORMAL      = 0x00000080      // файл.
}

public enum ShellFileInfoFlags
{
    SHGFI_ATTRIBUTES           = 0x00000800,
    SHGFI_ATTR_SPECIFIED       = 0x00020000,
    SHGFI_DISPLAYNAME          = 0x00000200,     // возвращать отображаемое имя файла.
    SHGFI_EXETYPE              = 0x00002000,
    SHGFI_ICON                 = 0x00000100,     // возвращать иконку.
    SHGFI_ICONLOCATION         = 0x00001000,
    SHGFI_LARGEICON            = 0x00000000,
    SHGFI_LINKOVERLAY          = 0x00008000,
    SHGFI_OPENICON             = 0x00000002,
    SHGFI_PIDL                 = 0x00000008,
    SHGFI_SELECTED             = 0x00010000,
    SHGFI_SHELLICONSIZE        = 0x00000004,
    SHGFI_SMALLICON            = 0x00000001,     // возвращать маленькую иконку файла.
    SHGFI_SYSICONINDEX         = 0x00004000,     // возвращать индекс в коллекции системных иконок.
    SHGFI_TYPENAME             = 0x00000400,     // возвращать наименование типа файла.
    SHGFI_USEFILEATTRIBUTES    = 0x00000010
}

[DllImport("Shell32.dll")]
private static extern IntPtr SHGetFileInfo(string drivePath, FileAttributes attributes, out SHFILEINFO fileInfo,
                uint countBytesFileInfo, ShellFileInfoFlags flags);
Re[2]: Получить иконку, ассоциированную с типом файла.
От: beemaster  
Дата: 12.06.04 16:59
Оценка:
Здравствуйте, Spark2K, Вы писали:

SK>Здравствуйте, Spaider, Вы писали:


S>>Как мне в .NET'е получить иконку, ассоциированную с типом файла?


SK>Вот, кажется, все, что надо:


SK>
SK>private Icon GetIconFromShell(string ext, bool isLargeIcon)
SK>{
SK>    SHFILEINFO fileInfo = new SHFILEINFO();
SK>    if(!isLargeIcon)
SK>        SHGetFileInfo(ext, FileAttributes.FILE_ATTRIBUTE_NORMAL, out fileInfo,
SK>            (uint)20, ShellFileInfoFlags.SHGFI_USEFILEATTRIBUTES | ShellFileInfoFlags.SHGFI_ICON | ShellFileInfoFlags.SHGFI_SMALLICON);
SK>    else
SK>        SHGetFileInfo(ext, FileAttributes.FILE_ATTRIBUTE_NORMAL, out fileInfo,
SK>            (uint)20, ShellFileInfoFlags.SHGFI_USEFILEATTRIBUTES | ShellFileInfoFlags.SHGFI_ICON);
SK>    if(fileInfo.hIcon == (IntPtr)0)  return null;
SK>    return Icon.FromHandle(fileInfo.hIcon);
SK>}

SK>private struct SHFILEINFO
SK>{
SK>    public IntPtr hIcon;             // дескриптор системной иконки.
SK>    public int iIcon;                // индекс системной иконки в коллекции системных иконок.
SK>    public uint dwAttributes;        // атрибуты файла.
SK>    public string szDisplayName;     // отображаемое имя файла.
SK>    public string szTypeName;        // наименование типа файла.
SK>}

SK>public enum FileAttributes
SK>{
SK>    FILE_ATTRIBUTE_DIRECTORY   = 0x00000010,     // каталог.
SK>    FILE_ATTRIBUTE_NORMAL      = 0x00000080      // файл.
SK>}

SK>public enum ShellFileInfoFlags
SK>{
SK>    SHGFI_ATTRIBUTES           = 0x00000800,
SK>    SHGFI_ATTR_SPECIFIED       = 0x00020000,
SK>    SHGFI_DISPLAYNAME          = 0x00000200,     // возвращать отображаемое имя файла.
SK>    SHGFI_EXETYPE              = 0x00002000,
SK>    SHGFI_ICON                 = 0x00000100,     // возвращать иконку.
SK>    SHGFI_ICONLOCATION         = 0x00001000,
SK>    SHGFI_LARGEICON            = 0x00000000,
SK>    SHGFI_LINKOVERLAY          = 0x00008000,
SK>    SHGFI_OPENICON             = 0x00000002,
SK>    SHGFI_PIDL                 = 0x00000008,
SK>    SHGFI_SELECTED             = 0x00010000,
SK>    SHGFI_SHELLICONSIZE        = 0x00000004,
SK>    SHGFI_SMALLICON            = 0x00000001,     // возвращать маленькую иконку файла.
SK>    SHGFI_SYSICONINDEX         = 0x00004000,     // возвращать индекс в коллекции системных иконок.
SK>    SHGFI_TYPENAME             = 0x00000400,     // возвращать наименование типа файла.
SK>    SHGFI_USEFILEATTRIBUTES    = 0x00000010
SK>}

SK>[DllImport("Shell32.dll")]
SK>private static extern IntPtr SHGetFileInfo(string drivePath, FileAttributes attributes, out SHFILEINFO fileInfo,
SK>                uint countBytesFileInfo, ShellFileInfoFlags flags);
SK>


Извините.
Попробовал всё как в данном примере (WindowsXP) — для маленькой и большой иконки даёт иконки windows по умолчанию, то есть самые примитивные. Как добиться обычных нормальных иконок как в Explorer?
Уже полдня копаюсь никак.
Помогите.
Re[3]: Получить иконку, ассоциированную с типом файла.
От: mike24  
Дата: 12.06.04 18:13
Оценка:
Здравствуйте, beemaster, Вы писали:

B>Здравствуйте, Spark2K, Вы писали:


SK>>Здравствуйте, Spaider, Вы писали:


S>>>Как мне в .NET'е получить иконку, ассоциированную с типом файла?



B>Попробовал всё как в данном примере (WindowsXP) — для маленькой и большой иконки даёт иконки windows по умолчанию, то есть самые примитивные. Как добиться обычных нормальных иконок как в Explorer?

B>Уже полдня копаюсь никак.
B>Помогите.

Get unlimited icons for files without bringing your application to its knees (if it has knees)



eto to chto ti iskal...



nemogu ustanovit russkuy raskladku
... << RSDN@Home 1.1.4 beta 2 >>
Re[4]: Получить иконку, ассоциированную с типом файла.
От: beemaster  
Дата: 13.06.04 09:34
Оценка:
Здравствуйте, mike24, Вы писали:

M>Здравствуйте, beemaster, Вы писали:


B>>Здравствуйте, Spark2K, Вы писали:


SK>>>Здравствуйте, Spaider, Вы писали:


S>>>>Как мне в .NET'е получить иконку, ассоциированную с типом файла?



B>>Попробовал всё как в данном примере (WindowsXP) — для маленькой и большой иконки даёт иконки windows по умолчанию, то есть самые примитивные. Как добиться обычных нормальных иконок как в Explorer?

B>>Уже полдня копаюсь никак.
B>>Помогите.

M>Get unlimited icons for files without bringing your application to its knees (if it has knees)


M>


M>eto to chto ti iskal...

M>


M>nemogu ustanovit russkuy raskladku



Огромное спасибо!
System.Drawing.Icon.FromHandle - будьте бдительны!
От: AlexZu Россия  
Дата: 18.06.04 12:26
Оценка: 8 (2)
#Имя: FAQ.dotnet.icon.fromhandle
Здравствуйте, shapkin, Вы писали:

S>Здравствуйте, Spaider, Вы писали:


S>>Как мне в .NET'е получить иконку, ассоциированную с типом файла?


S>HOW TO: Use the SHGetFileInfo Function to Get the Icons That Are Associated with Files in Visual C# .NET


Хотелось бы отметить, что этот пример от MS (как и примеры получения иконок файлов на gotdotnet) некорректен, т.к.
— в документации к SHGetFileInfo написано, что вызывающий отвечает за освобождение полученного хэндла иконки с помощью ф-и DestroyIcon
— объект Icon полученный с помощью Icon.FromHandle не владеет HICON, и соотв. при Dispose'е объекта Icon HICON не уничтожается

Т.к. не удобно хранить одновременно и Icon и HICON, то лучше использовать Bitmap.FromHicon, с полседующим уничтожением HICON.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.