Der er dog et andet problem: ExtractAssociatedIcon() henter ikonen ud af filen, og dette betyder at f.eks. BMP-billeder bliver repræsenteret som en nedskaleret (grim!) version af billedet i filen - ikke som en generisk BMP-ikon.
Pråv at tilføje nedenstående klasse til dit projekt:
using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace e702805
{
public class ExtractIcon
{
[DllImport("Shell32.dll")]
private static extern int SHGetFileInfo
(
string pszPath,
uint dwFileAttributes,
out SHFILEINFO psfi,
uint cbfileInfo,
SHGFI uFlags
);
[StructLayout(LayoutKind.Sequential)]
private struct SHFILEINFO
{
public SHFILEINFO(bool b)
{
hIcon = IntPtr.Zero; iIcon = 0; dwAttributes = 0; szDisplayName = ""; szTypeName = "";
}
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.LPStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.LPStr, SizeConst = 80)]
public string szTypeName;
};
private enum SHGFI
{
SmallIcon = 0x00000001,
OpenIcon = 0x00000002,
LargeIcon = 0x00000000,
Icon = 0x00000100,
DisplayName = 0x00000200,
Typename = 0x00000400,
SysIconIndex = 0x00004000,
LinkOverlay = 0x00008000,
UseFileAttributes = 0x00000010
}
/// <summary>
/// Get the associated Icon for a file or application, this method always returns
/// an icon. If the strPath is invalid or there is no idonc the default icon is returned
/// </summary>
/// <param name="strPath">full path to the file or directory</param>
/// <param name="bSmall">if true, the 16x16 icon is returned otherwise the 32x32</param>
/// <param name="bOpen">if true, and strPath is a folder, returns the 'open' icon rather than the 'closed'</param>
/// <returns></returns>
public static Icon GetIcon(string strPath, bool bSmall, bool bOpen)
{
SHFILEINFO info = new SHFILEINFO(true);
int cbFileInfo = Marshal.SizeOf(info);
SHGFI flags;
if (bSmall)
flags = SHGFI.Icon | SHGFI.SmallIcon;
else
flags = SHGFI.Icon | SHGFI.LargeIcon;
if (bOpen) flags = flags | SHGFI.OpenIcon;
SHGetFileInfo(strPath, 256, out info, (uint) cbFileInfo, flags);
return Icon.FromHandle(info.hIcon);
}
}
}
(Kilde:
http://blogs.prenia.com/cathi/PermaLink.aspx?guid=64613f2c-988e-4eb3-939b-e2d9699d3282)
Derefter kan du få fat i nogle lidt pænere ikoner (men stadig 32x32) på denne måde:
public Form1()
{
InitializeComponent();
this.listView1.View = View.LargeIcon; // Ændret
this.listView1.GridLines = true;
// Opret en kolonne til filnavnene.
this.listView1.Columns.Add("Filnavn");
// Opret en ImageList til ikonerne.
ImageList ikonListe = new ImageList();
this.listView1.LargeImageList = ikonListe; // Ændret
ikonListe.ImageSize = new Size(32, 32); // Nyt
// Scan biblioteket for all dets filer.
DirectoryInfo di = new DirectoryInfo(@"C:\Windows");
FileInfo[] fiArr = di.GetFiles();
foreach (FileInfo fi in fiArr)
{
// For hver fil findes dens assocerede ikon, og denne lægges i ImageList'en.
// Icon ikon = Icon.ExtractAssociatedIcon(fi.FullName);
Icon ikon = ExtractIcon.GetIcon(fi.FullName, false, false);
ikonListe.Images.Add(ikon);
// Opret et element i ListView'et, og angiv at den
// tilhørende "store ikon" er det netop tilføjede ikon.
ListViewItem lvi = new ListViewItem(fi.Name, ikonListe.Images.Count-1);
// Tilføj elemetet til ListView'et.
this.listView1.Items.Add(lvi);
}
}