listView 中的系统图标问题!
我在做一个文档管理程序,我将文件中数据存在数据库中,请问哪位高手知道按文件的扩展名取得此文件的系统图标,并将图标放在ListView中.
[解决办法]
参考如下代码
using System.Runtime.InteropServices;public static uint SHGFI_ICON = 0x100; public static uint SHGFI_DISPLAYNAME = 0x200; public static uint SHGFI_TYPENAME = 0x400; public static uint SHGFI_ATTRIBUTES = 0x800; public static uint SHGFI_ICONLOCATION = 0x1000; public static uint SHGFI_EXETYPE = 0x2000; public static uint SHGFI_SYSICONINDEX = 0x4000; public static uint SHGFI_LINKOVERLAY = 0x8000; public static uint SHGFI_SELECTED = 0x10000; public static uint SHGFI_LARGEICON = 0x0; public static uint SHGFI_SMALLICON = 0x1; public static uint SHGFI_OPENICON = 0x2; public static uint SHGFI_SHELLICONSIZE = 0x4; public static uint SHGFI_PIDL = 0x8; public static uint SHGFI_USEFILEATTRIBUTES = 0x10; public static uint FILE_ATTRIBUTE_NORMAL = 0x80;public static uint LVM_FIRST = 0x1000;public static uint LVM_SETIMAGELIST = LVM_FIRST + 3;public static uint LVSIL_NORMAL = 0;public static uint LVSIL_SMALL = 1;[DllImport("Shell32.dll")]public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, int cbfileInfo, uint uFlags);public struct SHFILEINFO{ public IntPtr hIcon; public int iIcon; public int dwAttributes; public string szDisplayName; public string szTypeName;}[DllImport("User32.DLL")]public static extern int SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);public void ListViewSysImages(ListView AListView){ SHFILEINFO vFileInfo = new SHFILEINFO(); IntPtr vImageList = SHGetFileInfo("", 0, ref vFileInfo, Marshal.SizeOf(vFileInfo), SHGFI_SHELLICONSIZE | SHGFI_SYSICONINDEX | SHGFI_LARGEICON); SendMessage(AListView.Handle, LVM_SETIMAGELIST, (IntPtr)LVSIL_NORMAL, vImageList); vImageList = SHGetFileInfo("", 0, ref vFileInfo, Marshal.SizeOf(vFileInfo), SHGFI_SHELLICONSIZE | SHGFI_SYSICONINDEX | SHGFI_SMALLICON); SendMessage(AListView.Handle, LVM_SETIMAGELIST, (IntPtr)LVSIL_SMALL, vImageList);}public int FileIconIndex(string AFileName){ SHFILEINFO vFileInfo = new SHFILEINFO(); SHGetFileInfo(AFileName, 0, ref vFileInfo, Marshal.SizeOf(vFileInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX); return vFileInfo.iIcon;}private void button1_Click(object sender, EventArgs e){ ListViewSysImages(listView1); listView1.Items.Add("temp.xml", FileIconIndex(@".xml"));}