首页 新闻 搜索 专区 学院

获取 应用程序 或文件的 图标

0
悬赏园豆:15 [已解决问题] 解决于 2014-09-23 10:11

C# 目前找到的方法有2中

一种为:  

 Icon icon = Icon.ExtractAssociatedIcon(fileFullPath);

 这种不怎么靠谱,有些文件的ICO干脆为空白

一种为:

  [StructLayout(LayoutKind.Sequential)]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public IntPtr iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        };
        class Win32
        {
            public const uint SHGFI_ICON = 0x100;
            public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
            public const uint SHGFI_SMALLICON = 0x1; // 'Small icon
            [DllImport("shell32.dll")]
            public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
            [DllImport("shell32.dll")]
            public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);
        }

      

SHFILEINFO shinfo = new SHFILEINFO();
Win32.SHGetFileInfo(fileName, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), Win32.SHGFI_ICON | Win32.SHGFI_LARGEICON);
System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
FileStream fileStream = new FileStream(path, FileMode.Create);
myIcon.Save(fileStream);
fileStream.Close();

第二种比第一种好点,但是也有些不正确

 

 

有没有大神还有其他的方法,比如360软件小助手中,管理文件获取的图标很清晰

metoer的主页 metoer | 初学一级 | 园豆:8
提问于:2014-08-13 16:04
< >
分享
最佳答案
0

帮你找了一个,有第三种方法,补充第二种方法的不足。

Building a Better ExtractAssociatedIcon

收获园豆:15
爱编程的大叔 | 高人七级 |园豆:30753 | 2014-08-13 17:31

发现用了效果和第二种一样的,没有360软件小助手那么准确,不过还是谢谢了

metoer | 园豆:8 (初学一级) | 2014-08-14 09:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册