Utilidades .NET 2.0

UtilIconos una clase para extraer iconos de ficheros usando el API de Windows

Usando API de Windows: ExtractIcon, ExtractIconEx y GetClassLong

Publicado el 25/Ago/2006
Actualizado el 25/Ago/2006
Autor: Guillermo 'guille' Som

La clase UtilIconos la podrás usar para extraer iconos de ficheros de recursos (.exe, .dll), utiliza interoperabilidad con funciones del API de Windows, y con muy pequeños cambios se puede usar con cualquier versión de .NET Framework. Como de costumbre, con código tanto para VB como para C#.

 

Introducción:

La clase UtilIconos la podrás usar para extraer iconos de ficheros de recursos (habitualmente .exe y .dll), utiliza interoperabilidad con funciones del API de Windows, y con muy pequeños cambios se puede usar con cualquier versión de .NET Framework, aunque el código aquí mostrado está hecho y probado con .NET Framework 2.0 (Visual Studio 2005).

Esa "exigencia" de .NET Framework 2.0 es principalmente por el método ExtractAssociatedIcon de la clase Icon que es exclusiva de esa versión del .NET, pulsa en el link para ver un ejemplo de cómo usar ese método.

 

Nota:

Tengo una utilidad que usa esta clase (en Visual Basic y en C#), esa utilidad además utiliza el registro de Windows, y como he creado una clase también para esas tareas de manipulación del registro, cuando lo tenga todo publicado pondré los links.

Por ahora te deje solo el código de la clase tanto para Visual Basic como para C#.

En el ZIP con el código completo está la utilidad y la clase de manipulación del registro que te acabo de comentar.

 

Espero que te sea de utilidad.

Nos vemos.
Guillermo

Abajo del todo tienes el ZIP con el código fuente para la versión 2005 de Visual Basic y Visual C#

 


Código para Visual Basic.NET (VB.NET)El código para VB .NET (cualquier versión)

'------------------------------------------------------------------------------
' UtilIconos                                                        (23/Ago/06)
' Clase para extraer iconos de ficheros de recursos.
'
' ©Guillermo 'guille' Som, 2006
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On

Imports Microsoft.VisualBasic
Imports System
' Para el PictureBox
Imports System.Windows.Forms
' Para Icon y Bitmap
Imports System.Drawing
' Para DllImport
Imports System.Runtime.InteropServices

Namespace elGuille.Util.Iconos

    ''' <summary>
    ''' Clase para extraer iconos de ficheros de recursos.
    ''' </summary>
    ''' <remarks></remarks>
    Public Class UtilIconos

        ' Declaraciones para extraer iconos de los programas
        <DllImport("shell32.dll")> _
        Private Shared Function ExtractIconEx( _
                ByVal lpszFile As String, ByVal nIconIndex As Integer, _
                ByRef phiconLarge As Integer, ByRef phiconSmall As Integer, _
                ByVal nIcons As UInteger) As Integer
        End Function

        <DllImport("shell32.dll")> _
        Private Shared Function ExtractIcon( _
                ByVal hInst As Integer, ByVal lpszExeFileName As String, _
                ByVal nIconIndex As Integer) As IntPtr
        End Function

        '<DllImport("user32.dll")> _
        'Private Shared Function GetClassWord( _
        '        ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
        'End Function

        <DllImport("user32.dll")> _
        Private Shared Function GetClassLong( _
                ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
        End Function

        Private Const GCW_HMODULE As Integer = (-16)
        '

        ''' <summary>
        ''' Asigna a un objeto Picture el icono indicado
        ''' </summary>
        ''' <param name="picBox">
        ''' El objeto Picture que tendrá el icono</param>
        ''' <param name="sPath">
        ''' El nombre del ejecutable o dll que contiene el icono</param>
        ''' <param name="indice">
        ''' El índice en base cero del icono</param>
        ''' <returns>
        ''' Devuelve un valor verdadero o falso según se haya asignado o no
        ''' </returns>
        ''' <remarks></remarks>
        Public Shared Function IconToPictureBox( _
                        ByVal picBox As PictureBox, _
                        ByVal sPath As String, _
                        ByVal indice As Integer) As Boolean

            Dim icono As Icon = IconPorIndice(sPath, indice)
            If icono IsNot Nothing Then
                picBox.Image = icono.ToBitmap
                Return True
            End If

            Return False
        End Function

        ''' <summary>
        ''' Devuelve un objeto Icon con el icono indicado
        ''' </summary>
        ''' <param name="sPath">
        ''' El nombre del ejecutable o dll que contiene el icono</param>
        ''' <param name="indice">
        ''' El índice en base cero del icono</param>
        ''' <returns>Un objeto Icon con el icono o Nothing si no existe</returns>
        ''' <remarks></remarks>
        Public Shared Function IconPorIndice( _
                        ByVal sPath As String, _
                        ByVal indice As Integer) As Icon
            Dim hInst As Integer
            Dim hIcon As IntPtr

            'hInst = GetClassWord(IntPtr.Zero, GCW_HMODULE)
            hInst = GetClassLong(IntPtr.Zero, GCW_HMODULE)
            hIcon = ExtractIcon(hInst, sPath, indice)
            If hIcon <> IntPtr.Zero Then
                Return Icon.FromHandle(hIcon)
            End If

            Return Nothing
        End Function

        ''' <summary>
        ''' Saber el número de iconos que tiene un exe o dll
        ''' </summary>
        ''' <param name="sPath">
        ''' El nombre del ejecutable o dll que contiene el icono</param>
        ''' <returns>Un valor entero con el número de iconos</returns>
        ''' <remarks></remarks>
        Public Shared Function TotalIconos(ByVal sPath As String) As Integer
            Return ExtractIconEx(sPath, -1, 0, 0, 0)
        End Function

        ''' <summary>
        ''' Devuelve el icono asociado al fichero indicado
        ''' </summary>
        ''' <param name="sFic">
        ''' Un fichero existente del que se quiere obtener el icono asociado
        ''' </param>
        ''' <returns>
        ''' Un objeto Icon con el icono o un valor nulo
        ''' si se produjo una excepción (o no tiene icono)
        ''' </returns>
        ''' <remarks></remarks>
        Public Shared Function IconAsociado(ByVal sFic As String) As Icon
            Dim icono As Icon = Nothing
            Try
                icono = Icon.ExtractAssociatedIcon(sFic)
            Catch 'ex As Exception
            End Try

            Return icono
        End Function

        ''' <summary>
        ''' Devuelve un Bitmap de un icono.
        ''' Si el icono tiene un valor nulo, se devuelve un valor nulo.
        ''' </summary>
        ''' <param name="icono">El icono a convertir en Bitmap</param>
        ''' <returns>El Bitmap o un valor nulo</returns>
        ''' <remarks>
        ''' Esta función es para evitar una excepción si se usa directamente
        ''' y el icono es un valor nulo.
        ''' </remarks>
        Public Shared Function IconToBitmap(ByVal icono As Icon) As Bitmap
            If icono Is Nothing Then
                Return Nothing
            Else
                Return icono.ToBitmap
            End If
        End Function
    End Class

End Namespace

 


Código para C Sharp (C#)El código para C# (cualquier versión)

//-----------------------------------------------------------------------------
// UtilIconos                                                       (24/Ago/06)
// Clase para extraer iconos de ficheros de recursos.
//
// Convertida de la clase UtilIconos.vb
//
// ©Guillermo 'guille' Som, 2006
//-----------------------------------------------------------------------------

using System;
// Para el PictureBox
using System.Windows.Forms;
// Para Icon y Bitmap
using System.Drawing;
// Para DllImport
using System.Runtime.InteropServices;


namespace elGuille.Util.Iconos
{
    /// <summary>
    /// Clase para extraer iconos de ficheros de recursos.
    /// </summary>
    public class UtilIconos
    {

        // Declaraciones para extraer iconos de los programas
        [DllImport("shell32.dll")]
        private extern static int ExtractIconEx(string lpszFile, int nIconIndex, 
                    ref int phiconLarge, ref int phiconSmall, uint nIcons);

        [DllImport("shell32.dll")]
        private extern static IntPtr ExtractIcon(int hInst,
                        string lpszExeFileName, int nIconIndex);

        [DllImport("user32.dll")]
        private extern static int GetClassLong(IntPtr hWnd, int nIndex);

        const int GCW_HMODULE = (-16);
        //

        /// <summary>
        /// Asigna a un objeto Picture el icono indicado
        /// </summary>
        /// <param name="picBox">
        /// El objeto Picture que tendrá el icono</param>
        /// <param name="sPath">
        /// El nombre del ejecutable o dll que contiene el icono</param>
        /// <param name="indice">
        /// El índice en base cero del icono</param>
        /// <returns>
        /// Devuelve un valor verdadero o falso según se haya asignado o no
        /// </returns>
        /// <remarks></remarks>
        public static bool IconToPictureBox(PictureBox picBox, string sPath, int indice)
        {

            Icon icono = IconPorIndice(sPath, indice);
            if( icono != null )
            {
                picBox.Image = icono.ToBitmap();
                return true;
            }

            return false;
        }

        /// <summary>
        /// Devuelve un objeto Icon con el icono indicado
        /// </summary>
        /// <param name="sPath">
        /// El nombre del ejecutable o dll que contiene el icono</param>
        /// <param name="indice">
        /// El índice en base cero del icono</param>
        /// <returns>Un objeto Icon con el icono o Nothing si no existe</returns>
        /// <remarks></remarks>
        public static Icon IconPorIndice(string sPath, int indice)
        {
            int hInst;
            IntPtr hIcon;

            hInst = GetClassLong(IntPtr.Zero, GCW_HMODULE);
            hIcon = ExtractIcon(hInst, sPath, indice);
            if( hIcon != IntPtr.Zero )
            {
                return Icon.FromHandle(hIcon);
            }

            return null;
        }

        /// <summary>
        /// Saber el número de iconos que tiene un exe o dll
        /// </summary>
        /// <param name="sPath">
        /// El nombre del ejecutable o dll que contiene el icono</param>
        /// <returns>Un valor entero con el número de iconos</returns>
        /// <remarks></remarks>
        public static int TotalIconos(string sPath)
        {
            int t1 = 0, t2 = 0;
            return ExtractIconEx(sPath, -1, ref t1, ref t2, 0);
        }

        /// <summary>
        /// Devuelve el icono asociado al fichero indicado
        /// </summary>
        /// <param name="sFic">
        /// Un fichero existente del que se quiere obtener el icono asociado
        /// </param>
        /// <returns>
        /// Un objeto Icon con el icono o un valor nulo
        /// si se produjo una excepción (o no tiene icono)
        /// </returns>
        /// <remarks></remarks>
        public static Icon IconAsociado(string sFic)
        {
            Icon icono = null;
            try
            {
                icono = Icon.ExtractAssociatedIcon(sFic);
            }
            catch
            { //ex As Exception
            }

            return icono;
        }

        /// <summary>
        /// Devuelve un Bitmap de un icono.
        /// Si el icono tiene un valor nulo, se devuelve un valor nulo.
        /// </summary>
        /// <param name="icono">El icono a convertir en Bitmap</param>
        /// <returns>El Bitmap o un valor nulo</returns>
        /// <remarks>
        /// Esta función es para evitar una excepción si se usa directamente
        /// y el icono es un valor nulo.
        /// </remarks>
        public static Bitmap IconToBitmap(Icon icono)
        {
            if( icono == null )
            {
                return null;
            }
            else
            {
                return icono.ToBitmap();
            }
        }
    }

}

 


Espacios de nombres usados en el código de este artículo:

System.Windows.Forms
System.Drawing
System.Runtime.InteropServices
 


Código de ejemplo (ZIP):

 

Fichero con el código de ejemplo: registro_InfoExt.zip - 93.7 KB (viernes, 25 de agosto de 2006)

(MD5 checksum: B33200C94AB335C2378CFCA46D2BD3BC)

 


Ir al índice principal de el Guille