Spesso capita di dover creare una struttura per allegare alcuni file all'interno delle nostre applicazioni
Ecco un piccolissimo frammento di codice che aiuta ad ottenere a runtime l'icona di default per ogni tipo di file conosciuto dalla nostra macchina.
[code language="c#"]
[DllImport("Shell32.dll", EntryPoint = "ExtractIconExW", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);
public static Icon GetIconForFileExtension(string fileextension)
{
try
{
// Verifico la struttura dell'estensione (deve avere il puntino)
if (!fileextension.StartsWith("."))
fileextension = "." + fileextension;
// Apro la chiave di registro dell'estensione ed ottengo l'applicazione associata al tipo di file
RegistryKey fileextregkey = Registry.ClassesRoot.OpenSubKey(fileextension);
string applicationname = fileextregkey.GetValue(string.Empty).ToString();
// Apro la chiave di registro dell'applicazione ed ottengo il path e la posizione dell'icona di default.
RegistryKey defaulticonkey = Registry.ClassesRoot.OpenSubKey(applicationname + @"\DefaultIcon");
string defaulticonpath = defaulticonkey.GetValue(string.Empty).ToString();
// Il tipo di file รจ composto da due parti separate da virgola, quindi procedo con lo split.
string[] iconargs = defaulticonpath.Split(',');
IntPtr large, small;
// Eseguo la chiamata alla API che mi permette di estrarre gli Handle che contengono le mie icone.
ExtractIconEx(iconargs[0], int.Parse(iconargs[1]), out large, out small, 1);
// Ottengo l'icona dall'Handle
Icon extractedIcon = Icon.FromHandle(small);
return extractedIcon;
}
catch
{
return null;
}
}
[/code]