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#
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
|
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
|