Cómo en .NET

El icono asociado a una extensión

Cómo extraer el icono de un fichero que está asociado a una aplicación, usando ExtractAssociatedIcon (solo .NET Framework 2.0)

Publicado el 24/Ago/2006
Actualizado el 20/Ene/2007
Autor: Guillermo 'guille' Som

En este artículo te explico cómo obtener el icono que está asociado a una extensión usando el método ExtractAssociatedIcon que es nuevo en .NET Framework 2.0, además de cómo convertir ese icono en un Bitmap, de forma que podamos usarlo en un control PictureBox. Y como de costumbre, con código para Visual Basic 2005 como para C# 2005.

 

Introducción:

Como te he comentado en la "descripción"; veremos cómo usar el método ExtractAssociatedIcon de la clase Icon, de forma que podamos obtener un objeto de tipo Icon para usarlo en nuestros programas. También veremos cómo convertir ese icono en un Bitmap para que podamos usarlo en un control de tipo PictureBox.

En realidad hay poco que explicar, pero más que nada por si te da por buscar cómo hacerlo, para que lo sepas.

Lo que hay que resaltar es que el método ExtractAssociatedIcon (que es estático o compartido) espera una cadena con el nombre de un fichero existente, y lo que devuelve es el icono que está asociado a la extensión (o tipo) de ese fichero.

Lo que no puedes hacer es usarlo de forma genérica para saber el icono asociado a una extensión en particular, (al menos si no sabes si existe o no un fichero de esa extensión), para saber eso, (el icono asociado a cualquier extensión), tendrás que usar acceso al registro de Windows. Estoy preparando una clase que te facilitará eso y mucho más, sigue atento, je, je.

El código que te voy a mostrar es válido para cualquier versión de .NET Framework, y por tanto para cualquier versión de Visual Basic y C#.

 

¿Cómo obtener el icono asociado a un fichero existente?

Pues usando el método ese que te he indicado:

Para Visual Basic 2005:

Dim icono As Icon
icono = System.Drawing.Icon.ExtractAssociatedIcon(Me.txtFic.Text)

Para C# 2005:

Icon icono;
icono = System.Drawing.Icon.ExtractAssociatedIcon(this.txtFic.Text);

 

¿Cómo convertir de Icon a Bitmap?

Esto no es nuevo en .NET Framework 2.0, en este caso es un método de instancia de la clase Icon, por tanto tendremos que usar el objeto que queremos convertir a un Bitmap. El método es: ToBitmap.
Para usarlo, simplemente usamos ese método desde la variable del icono, pero debemos comprobar que en realidad ese icono tenga algo, ya que si contiene un valor nulo, se producirá una excepción, por tanto... ¡mejor prevenir que curar!

Para Visual Basic 2005:

If icono IsNot Nothing Then
    Me.picIcon.Image = icono.ToBitmap()
Else
    Me.picIcon.Image = Nothing
End If

Para C# 2005:

if( icono != null )
{
    this.picIcon.Image = icono.ToBitmap();
}
else
{
    this.picIcon.Image = null;
}

 

Un ejemplo que usa de forma práctica lo explicado:

Abajo te pego el código de una aplicación de ejemplo en la que podemos indicar el fichero del que queremos averiguar el icono asociado.

Ese fichero lo podemos indicar usando un cuadro de diálogo de abrir (OpenFileDialog) o bien usando Drag & Drop (arrastrar y soltar), para lo cual usamos la comprobación de si el tipo de fichero soltado es uno de los indicados en la enumeración DataFormats, concretamente FileDrop.
Ese mismo "tipo" de fichero usado con arrastrar y soltar se puede indicar por medio de una cadena: "FileDrop", de cualquiera de las dos formas es válido.

Para aceptar ficheros soltados, debemos asignar un valor True a la propiedad AllowDrop, en este caso del formulario, con idea de que se suelte donde se suelte siempre se acepte.

Debido a que FileDrop puede contener más de un fichero, el tipo de datos contenido en el método GetData de la propiedad Data del segundo parámetro del evento DragDrop, es un array de tipo String, por tanto, si solo queremos saber el nombre del primer fichero, debemos tomar el que esté en el índice cero, pero debido a que el método GetData devuelve un valor Object, debemos hacer la conversión (casting) adecuada para convertir ese objeto en un array de tipo String, este sería el código:

Para Visual Basic .NET (todas las versiones):

If e.Data.GetDataPresent(DataFormats.FileDrop) Then
    Dim sFic As String
    ' Devuelve un array de tipo String,
    ' solo nos interesa el primer elemento
    sFic = CType(e.Data.GetData(DataFormats.FileDrop, True), String())(0)
    Me.txtFic.Text = sFic
End If

Para C# (todas las versiones):

if( e.Data.GetDataPresent(DataFormats.FileDrop) )
{
    string sFic;
    // Devuelve un array de tipo String,
    // solo nos interesa el primer elemento
    sFic = ((String[])e.Data.GetData(DataFormats.FileDrop, true))[0];
    this.txtFic.Text = sFic;
}

Para saber si se aceptan o no ficheros soltados, debemos comprobar de que tipo es lo que se quiere soltar, en este caso nos interesa FileDrop, pero podríamos comprobar lo que nos interesara, al menos si en lugar de arrastrar y soltar ficheros queremos que se puedan arrastrar otras cosas... pero no nos compliquemos.

Esa comprobación debemos hacerla en el evento DragEnter (o DragOver) y lo que hacemos es usar el método GetDataPresent de la propiedad Data del segundo parámetro del evento DragEnter.
El código sería como el mostrado antes, pero además debemos asignar un valor para el tipo de acción que queremos permitir, en este caso he usado el valor DragDropEffects.Copy, el cual asignaremos a la propiedad Effect del mencionado segundo parámetro del método del evento.
En el código completo puedes verlo con más detalle.

 

El icono se muestra a un tamaño de 64x64, para ello he usado el valor PictureBoxSizeMode.Zoom, el cual he asignado a la propiedad SizeMode del picture, al pulsar en el checkBox puedes hacer que se muestre al tamaño normal, (32x32).

 

Aquí tienes una captura del formulario en modo de diseño:

El formulario de la utilidad en modo diseño
El formulario de la utilidad en modo diseño

 

Te recuerdo que todo el código necesario (salvo la definición del formulario) lo tienes abajo, tanto para Visual Basic 2005 como para Visual C# 2005.

 

Espero que te sea de utilidad todo lo que te he explicado... ¡esa es la intención!

Nos vemos.
Guillermo

Al final de la página tienes el ZIP con el código para la versión 2005 de Visual Basic y Visual C#

 


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

'------------------------------------------------------------------------------
' Mostrar el icono asociado a un fichero                            (24/Ago/06)
' Usando el método compartido ExtractAssociatedIcon.
' Para convertir de Icon a Bitmap se usa ToBitmap.
' También se muestra como usar Drag & Drop
'
' ©Guillermo 'guille' Som, 2006
'------------------------------------------------------------------------------
Option Strict On
Option Explicit On

Imports Microsoft.VisualBasic
Imports System
Imports System.Windows.Forms
Imports System.Drawing

Public Class Form1

    Private Sub Form1_Load( _
                    ByVal sender As Object, _
                    ByVal e As EventArgs) Handles MyBase.Load
        ' Un fichero que seguramente todos tenemos
        Dim winDir As String = System.Environment.SystemDirectory
        Me.txtFic.Text = winDir & "\desktop.ini"
    End Sub

    Private Sub btnExaminar_Click( _
                    ByVal sender As Object, _
                    ByVal e As EventArgs) Handles btnExaminar.Click
        ' Seleccionar un fichero
        Dim openFD As New OpenFileDialog
        openFD.Title = "Selecciona el fichero del que quieres el icono"
        openFD.Filter = "Todos los ficheros (*.*)|*.*"
        If openFD.ShowDialog = Windows.Forms.DialogResult.OK Then
            Me.txtFic.Text = openFD.FileName
        End If
    End Sub

    Private Sub btnMostrar_Click( _
                    ByVal sender As Object, _
                    ByVal e As EventArgs) Handles btnMostrar.Click
        ' Mostrar el icono en el picture
        Try
            Dim icono As Icon
            icono = System.Drawing.Icon.ExtractAssociatedIcon(Me.txtFic.Text)
            ' Convertirlo a Bitmap y asignarlo a la propiedad Image del picture
            If icono IsNot Nothing Then
                Me.picIcon.Image = icono.ToBitmap()
            Else
                Me.picIcon.Image = Nothing
            End If
        Catch ex As Exception
            MessageBox.Show("ERROR:" & ex.Message, _
                            "Al extraer el icono asociado", _
                            MessageBoxButtons.OK, _
                            MessageBoxIcon.Exclamation)
        End Try
    End Sub

    Private Sub Form1_DragEnter( _
                    ByVal sender As Object, _
                    ByVal e As DragEventArgs) Handles MyBase.DragEnter
        ' Aceptar ficheros soltados
        ' Drag & Drop, comprobar con DataFormats
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            e.Effect = DragDropEffects.Copy
        End If
    End Sub

    Private Sub Form1_DragDrop( _
                    ByVal sender As Object, _
                    ByVal e As DragEventArgs) Handles MyBase.DragDrop
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            Dim sFic As String
            ' Devuelve un array de tipo String,
            ' solo nos interesa el primer elemento
            sFic = CType(e.Data.GetData(DataFormats.FileDrop, True), String())(0)
            Me.txtFic.Text = sFic
        End If
    End Sub

    Private Sub chkAjustar_CheckedChanged( _
                    ByVal sender As Object, _
                    ByVal e As EventArgs) Handles chkAjustar.CheckedChanged
        ' Ampliar el icono a 64x64 o dejarlo en normal
        If Me.chkAjustar.Checked Then
            Me.picIcon.SizeMode = PictureBoxSizeMode.Zoom
        Else
            Me.picIcon.SizeMode = PictureBoxSizeMode.Normal
        End If
    End Sub
End Class

 


Código para C Sharp (C#)El código para C#

//-----------------------------------------------------------------------------
// Mostrar el icono asociado a un fichero                           (24/Ago/06)
// Usando el método compartido ExtractAssociatedIcon.
// Para convertir de Icon a Bitmap se usa ToBitmap.
// También se muestra como usar Drag & Drop
//
// ©Guillermo 'guille' Som, 2006
//-----------------------------------------------------------------------------

using Microsoft.VisualBasic;
using System;
using System.Windows.Forms;
using System.Drawing;

namespace iconoAsociado_CS
{

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    
    private void Form1_Load(object sender, EventArgs e)
    {
        // Un fichero que seguramente todos tenemos
        string winDir = System.Environment.SystemDirectory;
        this.txtFic.Text = winDir + @"\desktop.ini";
    }

    private void btnExaminar_Click(object sender, EventArgs e)
    {
        // Seleccionar un fichero
        OpenFileDialog openFD = new OpenFileDialog();
        openFD.Title = "Selecciona el fichero del que quieres el icono";
        openFD.Filter = "Todos los ficheros (*.*)|*.*";
        if( openFD.ShowDialog() == System.Windows.Forms.DialogResult.OK )
        {
            this.txtFic.Text = openFD.FileName;
        }
    }

    private void btnMostrar_Click(object sender, EventArgs e)
    {
        // Mostrar el icono en el picture
        try
        {
            Icon icono;
            icono = System.Drawing.Icon.ExtractAssociatedIcon(this.txtFic.Text);
            // Convertirlo a Bitmap y asignarlo a la propiedad Image del picture
            if( icono != null )
            {
                this.picIcon.Image = icono.ToBitmap();
            }
            else
            {
                this.picIcon.Image = null;
            }
        }
        catch( Exception ex )
        {
            MessageBox.Show("ERROR:" + ex.Message, 
                            "Al extraer el icono asociado", 
                            MessageBoxButtons.OK, 
                            MessageBoxIcon.Exclamation);
        }
    }

    private void Form1_DragEnter(object sender, DragEventArgs e)
    {
        // Aceptar ficheros soltados
        // Drag & Drop, comprobar con DataFormats
        if( e.Data.GetDataPresent(DataFormats.FileDrop) )
        {
            e.Effect = DragDropEffects.Copy;
        }
    }

    private void Form1_DragDrop(object sender, DragEventArgs e)
    {
        if( e.Data.GetDataPresent(DataFormats.FileDrop) )
        {
            string sFic;
            // Devuelve un array de tipo String,
            // solo nos interesa el primer elemento
            sFic = ((string[])e.Data.GetData(DataFormats.FileDrop, true))[0];
            this.txtFic.Text = sFic;
        }
    }

    private void chkAjustar_CheckedChanged(object sender, EventArgs e)
    {
        // Ampliar el icono a 64x64 o dejarlo en normal
        if( this.chkAjustar.Checked )
        {
            this.picIcon.SizeMode = PictureBoxSizeMode.Zoom;
        }
        else
        {
            this.picIcon.SizeMode = PictureBoxSizeMode.Normal;
        }
    }
}

}

 


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

System.Windows.Forms
System.Drawing
 


"
Código de ejemplo (ZIP):

 

Fichero con el código de ejemplo: icono_asociado_extension.zip - 24.7 KB

(MD5 checksum: E9AC69CC79BF5E830DA795CFEDA1E971)

 


Ir al índice principal de el Guille