diff --git a/Util/FileIcon.cs b/Util/FileIcon.cs index f0d5c60..55cd22a 100644 --- a/Util/FileIcon.cs +++ b/Util/FileIcon.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; @@ -10,16 +11,31 @@ namespace GeekDesk.Util { public class FileIcon { - - private static List GetBlurExts() - { - List list = new List(); - list.Add(".exe"); - list.Add(".cer"); - list.Add(".lnk"); - return list; + static List blurExtsList; + static List pixelList; + static FileIcon() { + blurExtsList = new List + { + ".exe", + ".cer", + ".lnk", + ".chm" + }; + pixelList = new List + { + new int[]{ 256 / 4, 256 / 4 }, + new int[]{ 256 / 2, 256 / 4 }, + new int[]{ 256 / 4 * 3, 256 / 4 }, + new int[]{ 256 / 4, 256 / 2 }, + new int[]{ 256 / 4, 256 / 4 * 3 }, + new int[]{ 256 / 4 * 3, 256 / 2 }, + new int[]{ 256 / 4 * 3, 256 / 4 * 3 }, + new int[]{ 256 / 2, 256 / 4 * 3 }, + }; } + + [DllImport("User32.dll")] public static extern int PrivateExtractIcons( string lpszFile, //文件名可以是exe,dll,ico,cur,ani,bmp @@ -53,7 +69,7 @@ namespace GeekDesk.Util ip = hIcons[0]; ico = Icon.FromHandle(ip); } - else if (GetBlurExts().Contains(ext)) + else if (blurExtsList.Contains(ext)) { ico = Icon.ExtractAssociatedIcon(filePath); } @@ -61,8 +77,14 @@ namespace GeekDesk.Util { ip = GetJumboIcon(GetIconIndex(filePath)); ico = Icon.FromHandle(ip); + if (CheckIsSmallIco(ico.ToBitmap())) + { + ico = Icon.ExtractAssociatedIcon(filePath); + } } + + Bitmap bmp = ico.ToBitmap(); MemoryStream strm = new MemoryStream(); @@ -73,6 +95,7 @@ namespace GeekDesk.Util myEncoderParameters.Param[0] = myEncoderParameter; bmp.Save(strm, myImageCodecInfo, myEncoderParameters); + BitmapImage bmpImage = new BitmapImage(); bmpImage.BeginInit(); strm.Seek(0, SeekOrigin.Begin); @@ -82,6 +105,7 @@ namespace GeekDesk.Util { Shell32.DestroyIcon(ip); } + DeleteObject(bmp.GetHbitmap()); return bmpImage.Clone(); } @@ -98,6 +122,30 @@ namespace GeekDesk.Util return null; } + private static bool CheckIsSmallIco(Bitmap bm) + { + Color color; + int count = 0; + foreach (int[] arr in pixelList) + { + color = bm.GetPixel(arr[0], arr[1]); + if (color.A == 0) + { + count++; + } + } + DeleteObject(bm.GetHbitmap()); + if (count >= 6) + { + return true; + } + return false; + } + + + [System.Runtime.InteropServices.DllImport("gdi32.dll")] + public static extern bool DeleteObject(IntPtr onj); + public static int GetIconIndex(string pszFile)