此文记录的是图标操作的工具类。
/*** 图标工具类 Austin Liu 刘恒辉 Project Manager and Software Designer E-Mail: lzhdim@163.com Blog: http://lzhdim.cnblogs.com Date: 2024-01-15 15:18:00 使用说明: 1、获取图标; IconUtil.GetIconFromDll(filePath, iconIndex); 2、保存图标; IconUtil.SaveIconToFile(icon, filePath); 3、获取图标列表; 3.1、获取图标列表; private uint _nIcons = 0; _nIcons = IconUtil.PrivateExtractIcons(filePath, 0, 0, 0, null, null, 0, 0); if (_nIcons == 0) { return; } IntPtr[] phicon = new IntPtr[_nIcons]; uint[] piconid = new uint[_nIcons]; uint nIcons = IconUtil.PrivateExtractIcons(filePath, 0, 32, 32, phicon, piconid, _nIcons, 0); for (int i = 0; i < nIcons; i++) { Icon icon = Icon.FromHandle(phicon[i]); imageList.Images.Add(icon.ToBitmap()); icon.Dispose(); IconUtil.DestroyIcon(phicon[i]); } 3.2、保存某个图标; IntPtr[] phicon = new IntPtr[_nIcons]; uint[] piconid = new uint[_nIcons]; uint nIcons = IconUtil.PrivateExtractIcons(_FilePath, 0, 256, 256, phicon, piconid, _nIcons, 0); int iIndex = 0; if (listView1.SelectedItems.Count > 0) { iIndex = int.Parse(listView1.SelectedItems[0].Text); } IconUtil.SaveIconToFile(Icon.FromHandle(phicon[iIndex]), Path.Combine(folderBrowserDialog.SelectedPath, $"{iIndex}.ico")); ***/ namespace Lzhdim.LPF.Utility { using System; using System.Drawing; using System.IO; using System.Runtime.InteropServices; /// <summary> /// 图标工具类 /// </summary> public class IconUtil { #region 使用Win32API获取图标 [DllImport("User32.dll")] public static extern int DestroyIcon( /* _In_ */ IntPtr hIcon); [DllImport("User32.dll")] public static extern uint PrivateExtractIcons( /* _In_reads_(MAX_PATH) */ string szFileName, /* _In_ */ int nIconIndex, /* _In_ */ int cxIcon, /* _In_ */ int cyIcon, /* _Out_writes_opt_(nIcons) */ IntPtr[] phicon, /* _Out_writes_opt_(nIcons) */ uint[] piconid, /* _In_ */ uint nIcons, /* _In_ */ uint flags); #endregion 使用Win32API获取图标 /// <summary> /// 从DLL中提取图标 /// </summary> /// <param name="filePath">文件路径</param> /// <param name="iconIndex">图标索引</param> /// <returns>图标文件</returns> public static Icon ExtractIconFromFile(string filePath, int iconIndex) { IntPtr largeIconHandle = Win32API.LoadImage(IntPtr.Zero, filePath, Win32API.IMAGE_ICON, 0, 0, Win32API.LR_LOADFROMFILE | Win32API.LR_DEFAULTSIZE); if (largeIconHandle == IntPtr.Zero) { return null; } IntPtr iconHandle = Win32API.ImageList_GetIcon(largeIconHandle, iconIndex, Win32API.ILD_TRANSPARENT); if (iconHandle == IntPtr.Zero) { Win32API.DestroyIcon(largeIconHandle); return null; } Icon icon = Icon.FromHandle(iconHandle); Win32API.DestroyIcon(largeIconHandle); return icon; } /// <summary> /// 保存图标到文件 /// </summary> /// <param name="icon"></param> /// <param name="filePath"></param> public static void SaveIconToFile(Icon icon, string filePath) { using (Stream output = File.Create(filePath)) { icon.Save(output); } } /// <summary> /// 使用到的Windows API /// </summary> private static class Win32API { public const int ILD_TRANSPARENT = 0x00000001; public const int IMAGE_ICON = 1; public const uint LR_DEFAULTSIZE = 0x00000040; public const uint LR_LOADFROMFILE = 0x00000010; [DllImport("user32.dll")] public static extern bool DestroyIcon(IntPtr hIcon); [DllImport("user32.dll")] public static extern IntPtr ImageList_GetIcon(IntPtr himl, int i, uint flags); [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern IntPtr LoadImage(IntPtr hInstance, string lpsz, uint nImageType, int cxDesired, int cyDesired, uint fuLoad); } } }
Austin Liu 刘恒辉
Project Manager and Software Designer E-Mail:lzhdim@163.com Blog:https://lzhdim.cnblogs.com 欢迎收藏和转载此博客中的博文,但是请注明出处,给笔者一个与大家交流的空间。谢谢大家。 |