Estrarre l'icona di default

Ecco  una classe che ci aiuta a caricare l'icona associata ad un certo tipo di file... è ancora da aggiustare perchè alclune icone non vengono correttamente estratte ma credo sia un punto di partenza :-p

using System;
using System.Drawing;
using Microsoft.Win32; //Si dovrà usare il registro di Windows.
using System.Runtime.InteropServices; //Si dovrà usare un API di sistema.

public abstract class IconUtils
{
  //Importo API ExtractIcon.
  [DllImport("shell32.dll")]
  private static extern IntPtr ExtractIcon(IntPtr hInstance, string lpszExeFileName, int nIconIndex);

  ///
  /// Il metodo torna l'icona associata ad una estensione oppure
  /// null se non ve ne sono di associabilli.
  ///

  public static Icon FromFileExtension(string extension){

    //Recupero nel registro il tipo di file associato all'estensione...
    string fileType = null;
    RegistryKey extKey = Registry.ClassesRoot.OpenSubKey(extension);
    if(extKey != null){
      using(extKey){
        fileType = extKey.GetValue(null) as string;
      }
    }

    //Recupero nel registro la locazione dell'icona di default associata al tipo di file...
    string iconLocation = null;
    if(fileType != null){
      RegistryKey fileTypeKey = Registry.ClassesRoot.OpenSubKey(fileType);
      if(fileTypeKey != null){
        using(fileTypeKey){
          RegistryKey iconKey = fileTypeKey.OpenSubKey("DefaultIcon");
          if(iconKey != null){
            using(iconKey){
              iconLocation = iconKey.GetValue(null) as string;
            }
          }
        }
      }
    }

    /* L'icona si potrebbe trovare in un file a se stante oppure potrebbe essere parte delle
    risorse di un "exe" o di una "dll" (esempio "%SystemRoot%\system32\shell32.dll,-152"). */

    if(iconLocation != null){
      string moduleName = iconLocation;
      int iconIndex = 0;
      if(iconLocation.IndexOf(",") != -1){
        string[] parameters = icon.Split(',');
        moduleName = parameters[0];
        iconIndex = int.Parse(parameters[1]);
      }
      IntPtr hIcon = ExtractIcon(IntPtr.Zero, moduleName, iconIndex);
      if(hIcon != IntPtr.Zero)
        return Icon.FromHandle(hIcon);
    }
    return null;
  }
}

//Ecco come testare la classe implementata...
Icon ico = IconUtils.FromFileExtension(".txt");

Attenzione: le classi Icon sono IDisposable e vanno quindi rilasciate quanto prima quando non più necessarie.

posted @ giovedì 9 febbraio 2006 22:09

Print
Comments have been closed on this topic.
«aprile»
domlunmarmergiovensab
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011