Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

351
Visualizações
¿Hay alguna forma de obtener el ícono de la carpeta predeterminada de Windows usando C#?

Tengo un listView con una lista de documentos. A cada uno de ellos le asigné un icono, usando el siguiente método:

 private void SetDocumentIcon(ListViewItem item, FileInfo file) { Icon iconForFile = Icon.ExtractAssociatedIcon(file.FullName); if (!documentsIconsImageList.Images.ContainsKey(file.Extension)) { iconForFile = Icon.ExtractAssociatedIcon(file.FullName); documentsIconsImageList.Images.Add(file.Extension, iconForFile); } item.ImageKey = file.Extension; }

Traté de usar este método para una carpeta, pero falla. El problema, según tengo entendido, es que Icon.ExtractAssociatedIcon es para archivos y no para carpetas. Entonces, ¿cómo puedo extraer el icono de una carpeta?

Gracias.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

SHGetStockIconInfo es la forma correcta de hacerlo y no requiere la adición de archivos IO innecesarios. No es más complicado que SHGetFileInfo .

Aquí hay una clase de ejemplo estructurada de manera similar a la clase de Evk. Algunas cosas importantes a tener en cuenta:

  1. Cuando obtiene un identificador de icono de SHGetStockIconInfo (o incluso SHGetFileInfo , para el caso), el icono nativo debe limpiarse llamando a DestroyIcon() , de lo contrario, creará una fuga de recursos.
  2. Cuando crea un ícono usando Icon.FromHandle() , el objeto almacena el identificador que le dio y lo usará para operaciones posteriores. Esto significa que si llama inmediatamente a DestroyIcon() y luego intenta hacer algo con el icono que acaba de crear, se producirán excepciones. Puede evitar esto usando Clone() para obtener un Icon que no dependa de su identificador nativo original.
 public static class DefaultIcons { private static Icon folderIcon; public static Icon FolderLarge => folderIcon ?? (folderIcon = GetStockIcon(SHSIID_FOLDER, SHGSI_LARGEICON)); private static Icon GetStockIcon(uint type, uint size) { var info = new SHSTOCKICONINFO(); info.cbSize = (uint)Marshal.SizeOf(info); SHGetStockIconInfo(type, SHGSI_ICON | size, ref info); var icon = (Icon)Icon.FromHandle(info.hIcon).Clone(); // Get a copy that doesn't use the original handle DestroyIcon(info.hIcon); // Clean up native icon to prevent resource leak return icon; } [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct SHSTOCKICONINFO { public uint cbSize; public IntPtr hIcon; public int iSysIconIndex; public int iIcon; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szPath; } [DllImport("shell32.dll")] public static extern int SHGetStockIconInfo(uint siid, uint uFlags, ref SHSTOCKICONINFO psii); [DllImport("user32.dll")] public static extern bool DestroyIcon(IntPtr handle); private const uint SHSIID_FOLDER = 0x3; private const uint SHGSI_ICON = 0x100; private const uint SHGSI_LARGEICON = 0x0; private const uint SHGSI_SMALLICON = 0x1; }
over 4 years ago · Santiago Trujillo Relatório

0

Apuesto a que hay otras formas, pero creo que la más fácil de implementar es simplemente usar la función SHGetFileInfo win api sobre la carpeta temporal que crea. Código de ejemplo:

 public static class DefaultIcons { private static readonly Lazy<Icon> _lazyFolderIcon = new Lazy<Icon>(FetchIcon, true); public static Icon FolderLarge { get { return _lazyFolderIcon.Value; } } private static Icon FetchIcon() { var tmpDir = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString())).FullName; var icon = ExtractFromPath(tmpDir); Directory.Delete(tmpDir); return icon; } private static Icon ExtractFromPath(string path) { SHFILEINFO shinfo = new SHFILEINFO(); SHGetFileInfo( path, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_LARGEICON); return System.Drawing.Icon.FromHandle(shinfo.hIcon); } //Struct used by SHGetFileInfo function [StructLayout(LayoutKind.Sequential)] private 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; }; [DllImport("shell32.dll")] private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); private const uint SHGFI_ICON = 0x100; private const uint SHGFI_LARGEICON = 0x0; private const uint SHGFI_SMALLICON = 0x000000001; }

el uso es solo

 var icon = DefaultIcons.FolderLarge

También es trivial agregar propiedades para íconos pequeños.

over 4 years ago · Santiago Trujillo Relatório

0

public static class DefaultIcons { private static readonly Lazy _lazyFolderIcon = new Lazy(FetchIcon, true);

 public static Icon FolderLarge { get { return _lazyFolderIcon.Value; } } private static Icon FetchIcon() { var tmpDir = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString())).FullName; var icon = ExtractFromPath(tmpDir); Directory.Delete(tmpDir); return icon; } private static Icon ExtractFromPath(string path) { SHFILEINFO shinfo = new SHFILEINFO(); SHGetFileInfo( path, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), SHGFI_ICON | SHGFI_LARGEICON); return System.Drawing.Icon.FromHandle(shinfo.hIcon); } //Struct used by SHGetFileInfo function [StructLayout(LayoutKind.Sequential)] private 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; }; [DllImport("shell32.dll")] private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); private const uint SHGFI_ICON = 0x100; private const uint SHGFI_LARGEICON = 0x0; private const uint SHGFI_SMALLICON = 0x000000001;

}

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda