Как мне в .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
Здравствуйте, 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 >>
Здравствуйте, 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);
Здравствуйте, 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?
Уже полдня копаюсь никак.
Помогите.
Здравствуйте, 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 >>
Здравствуйте, 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
Огромное спасибо!
Здравствуйте, 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.