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