Pregunta

Tengo el nombre de la ruta a un archivo .exe.

¿Cómo encuentro la ruta al ícono que usaría Windows si este archivo se colocara en el escritorio?(Quiero mostrar este icono en mi propio programa).

Necesito poder encontrar el ícono a través de mi programa C# en tiempo de ejecución.

Usando C# en Visual Studio 2008.

¿Fue útil?

Solución

Si encontré este código en línea hace un tiempo para hacer eso:

class Win32
{
    public const uint SHGFI_ICON = 0x100;
    public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
    public const uint SHGFI_SMALLICON = 0x1; // 'Small icon

    [DllImport("shell32.dll")]
    public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);

    public static Bitmap GetFileIcon(string fName)
    {
        IntPtr hImgSmall; //the handle to the system image list
        SHFILEINFO shinfo = new SHFILEINFO();
        hImgSmall = Win32.SHGetFileInfo(fName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON);
        return Icon.FromHandle(shinfo.hIcon).ToBitmap();
    }
}


[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
    public IntPtr hIcon;
    public IntPtr iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
};

también necesitas

using System.Drawing;
using System.Runtime.InteropServices;

para hacer referencia a todas las clases apropiadas

Otros consejos

El icono por defecto sería el que incrustado en el exe en el índice 0.

Mira:. Proyecto propiedades> pestaña de aplicaciones> icono

Este artículo CodeProject parece hacer el trabajo bastante bien. Proporciona una clase IconExtractor que encapsula toda la materia de la API de Win32 para usted en una interfaz administrada agradable.

Se puede utilizar como tal:

using TKageyu.Utils;

...

using (IconExtractor ie = new IconExtractor(@"D:\sample.exe")) 
{
    Icon icon0 = ie.GetIcon(0);
    Icon icon1 = ie.GetIcon(1);

    ...

    Icon[] splitIcons = IconExtractor.SplitIcon(icon0);

    ...
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top