Cómo extraer el icono de un ejecutable con C# en WinForms

Lo sé, es extraño terminar haciendo esto para obtener el ícono de una aplicación que no puedes encontrar en Internet, bastante extraño. Sin embargo, como último recurso, ¡es genial! Después de buscar en Google varias formas de cómo extraer el ícono de cualquier ejecutable en Windows, había muchas aplicaciones con licencia que ayudarían al usuario a hacer esto, pero terminé nuevamente escribiendo mi propia solución para esto. En este caso, estaba tratando de encontrar el icono de PuTTYGen.

En este artículo, te voy a explicar cómo obtener fácilmente el ícono (archivo .ico) de cualquier ejecutable en Windows usando C# en WinForms.

Extraer el icono con ExtractAssociatedIcon

Las clases de Drawing de .NET te permiten obtener el icono de un ejecutable específico, específicamente en la clase de Icon. Cuando se usa el método ExtractAssociatedIcon con mapas de bits, se puede devolver una imagen en miniatura en lugar de un icono, solo si el sistema que ejecuta la aplicación tiene una configuración de registro que hace que los archivos de mapa de bits se muestren como imágenes en miniatura.

El siguiente método auxiliar hará el truco para detectar cualquier posible excepción en tu código:

//Importar el espacio de nombres de dibujo
using System.Drawing;

/// <summary>
/// Devuelve una representación de icono de una imagen contenida en el archivo especificado.
/// </summary>
/// <param name="executablePath"></param>
/// <returns></returns>
public static Icon ExtractIconFromFilePath(string executablePath)
{
    Icon result = (Icon) null;

    try
    {
        result = Icon.ExtractAssociatedIcon(executablePath);
    }
    catch (Exception)
    {
        Console.WriteLine("Unable to extract the icon from the binary");
    }

    return result;
}

Puedes hacer lo que necesites con el icono con este método.

Guardar el icono

En nuestro caso, solo necesitamos guardar el icono como un archivo en el sistema para luego convertirlo a PNG. Sin embargo, los objetos de icono deben guardarse utilizando un FileStream, por ejemplo, para obtener el icono de PuTTYgen:

// 1. Especifique la ruta absoluta del ejecutable
string executablePath = @"C:\Program Files\PuTTY\puttygen.exe";

// 2. Almacenar la instancia del icono
Icon theIcon = ExtractIconFromFilePath(executablePath);

// 3. Si se extrajo el icono, proceda a guardarlo
if (theIcon != null)
{
    // 4. Guardar el icono en mi escritorio
    using (FileStream stream = new FileStream(@"C:\Users\sdkca\Desktop\puttygen.ico", FileMode.CreateNew))
    {
        theIcon.Save(stream);
    }
}

El icono extraído de Puttygen es:

Puttygen Icon

Genial, ¿no?

Ejemplo completo

La siguiente clase muestra un ejemplo básico de cómo usarlo al activar la extracción del icono al hacer clic en un botón:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;

namespace Sandbox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string executablePath = @"C:\Program Files\PuTTY\puttygen.exe";

            Icon theIcon = ExtractIconFromFilePath(executablePath);

            if (theIcon != null)
            {
                // Guárdelo en el disco o haga lo que quiera con él.
                using (FileStream stream = new FileStream(@"C:\Users\sdkca\Desktop\myfile.ico", FileMode.CreateNew))
                {
                    theIcon.Save(stream);
                }
            }
        }

        /// <summary>
        /// Devuelve una representación de icono de una imagen contenida en el archivo especificado.
        /// </summary>
        /// <param name="executablePath"></param>
        /// <returns></returns>
        public static Icon ExtractIconFromFilePath(string executablePath)
        {
            Icon result = (Icon) null;

            try
            {
                result = Icon.ExtractAssociatedIcon(executablePath);
            }
            catch (Exception)
            {
                Console.WriteLine("No se puede extraer el icono del binario");
            }

            return result;
        }
    }
}

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable