
最近写一个小程序需要获得启动项的信息在读取启动程序图标时遇到了这个问题我们知道在c#里添加图标最常用的方法是使用ImageList但要读取的程序图标是动态的那么就需要动态的获得文件的图标在网上找了找发现有一个类直接使用就可以了贴出来和大家共享本人在写一个类似于360safe的东西不过软件增加了更多的个人色彩希望大家能多多交流showSystemIcon.cs1usingSystem;2usingSystem.Collections.Generic;3usingSystem.ComponentModel;4usingSystem.Data;5usingSystem.Drawing;6usingSystem.Text;7usingSystem.Windows.Forms;8usingSystem.Runtime.InteropServices;910namespaceRepairTools_2._011{12classshowSystemIcon13{14publicstaticuintSHGFI_ICON0x100;15publicstaticuintSHGFI_DISPLAYNAME0x200;16publicstaticuintSHGFI_TYPENAME0x400;17publicstaticuintSHGFI_ATTRIBUTES0x800;18publicstaticuintSHGFI_ICONLOCATION0x1000;19publicstaticuintSHGFI_EXETYPE0x2000;20publicstaticuintSHGFI_SYSICONINDEX0x4000;21publicstaticuintSHGFI_LINKOVERLAY0x8000;22publicstaticuintSHGFI_SELECTED0x10000;23publicstaticuintSHGFI_LARGEICON0x0;24publicstaticuintSHGFI_SMALLICON0x1;25publicstaticuintSHGFI_OPENICON0x2;26publicstaticuintSHGFI_SHELLICONSIZE0x4;27publicstaticuintSHGFI_PIDL0x8;28publicstaticuintSHGFI_USEFILEATTRIBUTES0x10;2930publicstaticuintFILE_ATTRIBUTE_NORMAL0x80;31publicstaticuintLVM_FIRST0x1000;32publicstaticuintLVM_SETIMAGELISTLVM_FIRST3;33publicstaticuintLVSIL_NORMAL0;34publicstaticuintLVSIL_SMALL1;3536[DllImport(Shell32.dll)]37publicstaticexternIntPtr SHGetFileInfo(stringpszPath,38uintdwFileAttributes,refSHFILEINFO psfi,39intcbfileInfo,uintuFlags);4041publicstructSHFILEINFO42{43publicIntPtr hIcon;44publicintiIcon;45publicintdwAttributes;46publicstringszDisplayName;47publicstringszTypeName;48}4950[DllImport(User32.DLL)]51publicstaticexternintSendMessage(IntPtr hWnd,52uintMsg, IntPtr wParam, IntPtr lParam);5354publicvoidListViewSysImages(ListView AListView)55{56SHFILEINFO vFileInfonewSHFILEINFO();57IntPtr vImageListSHGetFileInfo(,0,refvFileInfo,58Marshal.SizeOf(vFileInfo), SHGFI_SHELLICONSIZE|59SHGFI_SYSICONINDEX|SHGFI_LARGEICON);6061SendMessage(AListView.Handle, LVM_SETIMAGELIST, (IntPtr)LVSIL_NORMAL,62vImageList);6364vImageListSHGetFileInfo(,0,refvFileInfo,65Marshal.SizeOf(vFileInfo), SHGFI_SHELLICONSIZE|66SHGFI_SYSICONINDEX|SHGFI_SMALLICON);67SendMessage(AListView.Handle, LVM_SETIMAGELIST, (IntPtr)LVSIL_SMALL,68vImageList);69}7071publicintFileIconIndex(stringAFileName)72{73SHFILEINFO vFileInfonewSHFILEINFO();74SHGetFileInfo(AFileName,0,refvFileInfo,75Marshal.SizeOf(vFileInfo), SHGFI_SYSICONINDEX);76returnvFileInfo.iIcon;77}78}79}80使用把它添加到ListView中1privatevoidbtnRunSearch_Click(objectsender, EventArgs e)2{3try4{5ListViewItem lvi;6ListViewItem.ListViewSubItem lvsi;7showSystemIcon showIconnewshowSystemIcon();89this.lvStartupFileList.Items.Clear();10lvStartupFileList.BeginUpdate();11foreach(stringstrinRegistryOperate.strRunRegistry())12{13stringstr1RegistryOperate.returnRun().GetValue(str).ToString();14showIcon.ListViewSysImages(lvStartupFileList);15lvinewListViewItem();16lvi.Textstr;17lvi.ImageIndexshowIcon.FileIconIndex(str1);18lvsinewListViewItem.ListViewSubItem();19lvsi.Textstr1;20lvi.SubItems.Add(lvsi);21lvStartupFileList.Items.Add(lvi);22}23lvStartupFileList.EndUpdate();24}25catch26{27MessageBox.Show(e.ToString());28}29}有什么问题大家交流交流吧