Ogni versione di Windows è caratterizzata da un nuovo stile per le icone di sistema. Se la nostra applicazione fa uso di queste icone, utilizzando il Platform Invoke è possibile recuperare tali risorse direttamente dai file di Windows, in modo che il programma adatti il proprio stile grafico a quello del sistema su cui è in esecuzione:
[DllImport("shell32.dll", EntryPoint = "ExtractIconA")]
private static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);
[DllImport("user32.dll")]
private static extern int DestroyIcon(IntPtr hIcon);
public Image GetIcon(string fileName, int iconNumber)
{
IntPtr hInstance = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
IntPtr hIcon = ExtractIcon(hInstance, fileName, iconNumber);
Bitmap bitmap = Bitmap.FromHicon(hIcon);
DestroyIcon(hIcon);
return bitmap;
}
La funzione GetIcon restituisce un oggetto di tipo Bitmap che rappresenta l'icona estratta dal file specificato. Ad esempio, per ottenere l'icona dell'unità di sistema di Windows Vista si deve utilizzare la seguente istruzione:
pictureBox1.Image = GetIcon("imageres.dll", 30);
Dove 30 è la posizione dell'icona nel file (l'indice è a base 0).