Exemple #1
0
        /// <summary>
        ///		Get system icon for specified folder/file
        /// </summary>
        /// <param name="path"> Full path to a folder or file </param>
        /// <param name="type"> Type: folder or file </param>
        /// <param name="size"> Icon size: small or large</param>
        /// <param name="isOpen"> Is open icon (applicable for folders only) </param>
        /// <returns></returns>
        public static Icon GetIcon(string path, ItemType type, IconSize size, bool isOpen)
        {
            var flags = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES;
            var attribute = (type == ItemType.Folder) ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_FILE;
            if (isOpen)
                flags += SHGFI_OPENICON;

            if (size == IconSize.Small)
                flags += SHGFI_SMALLICON;
            else
                flags += SHGFI_LARGEICON;

            var shfi = new SHFileInfo();
            var res = SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags);
            if (Equals(res, IntPtr.Zero))
                throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
            try
            {
                Icon.FromHandle(shfi.hIcon);
                return (Icon)Icon.FromHandle(shfi.hIcon).Clone();
            }
            finally
            {
                DestroyIcon(shfi.hIcon);
            }
        }
        private static readonly uint sizeOfSHFileInfo = (uint)Marshal.SizeOf(typeof(SHFileInfo)); // Size of SHFileInfo struct.

        #endregion Fields

        #region Methods

        /// <summary>
        /// Gets the icon for a directory or drive.
        /// </summary>
        /// <param name="path">The path to the directory or drive.</param>
        /// <returns>The icon for the directory or drive.</returns>
        public static Icon GetDirectoryIcon(string path)
        {
            SHFileInfo shInfo = new SHFileInfo();
            SHGetFileInfo(path, 0, ref shInfo, sizeOfSHFileInfo, SHGFI_ICON | SHGFI_SMALLICON);

            Icon icon = (Icon)Icon.FromHandle(shInfo.HIcon).Clone();
            DestroyIcon(shInfo.HIcon);

            return icon;
        }
Exemple #3
0
        /// <summary>
        /// 获取系统文件图标
        /// </summary>
        /// <param name="fileName">文件类型的扩展名或文件的绝对路径,如果是一个exe可执行文件,请提供完整的文件名(包含路径信息)</param>
        /// <param name="isSmallIcon">是否返回小图标</param>
        /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param>
        /// <returns>返回一个Icon类型的文件图标对象</returns>
        public static Icon GetFileIcon(string fileName, bool isSmallIcon, out long imageIndex)
        {
            imageIndex = ErrorFileIndex;
            if (String.IsNullOrEmpty(fileName))
            {
                return(null);
            }

            SHFileInfo      shfi   = new SHFileInfo();
            SHFileInfoFlags uFlags = SHFileInfoFlags.Icon | SHFileInfoFlags.ShellIconSize;

            if (isSmallIcon)
            {
                uFlags |= SHFileInfoFlags.SmallIcon;
            }
            else
            {
                uFlags |= SHFileInfoFlags.LargeIcon;
            }
            FileInfo fi = new FileInfo(fileName);

            if (fi.Name.ToUpper().EndsWith(".EXE"))
            {
                uFlags |= SHFileInfoFlags.ExeType;
            }
            else
            {
                uFlags |= SHFileInfoFlags.UseFileAttributes;
            }

            int iTotal = (int)SHGetFileInfo(fileName, FileAttribute.Normal, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags);
            //或int iTotal = (int)SHGetFileInfo(fileName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags);
            Icon icon = null;

            if (iTotal > 0)
            {
                icon       = Icon.FromHandle(shfi.hIcon).Clone() as Icon;
                imageIndex = shfi.iIcon.ToInt64();
            }
            DestroyIcon(shfi.hIcon); //释放资源
            return(icon);
        }
Exemple #4
0
 /// <summary>
 /// 获取文件类型
 /// </summary>
 /// <param name="path">文件名</param>
 /// <param name="dwAttr">文件信息</param>
 /// <param name="dwFlag">信息控制字</param>
 /// <returns></returns>
 private static string GetTypeName(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag)
 {
     try
     {
         SHFileInfo fi     = new SHFileInfo();
         int        iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag);
         if (iTotal > 0)
         {
             return(fi.szTypeName);
         }
         else
         {
             return("");
         }
     }
     catch
     {
         return("");
     }
 }
Exemple #5
0
        /* Level One: Calls TDode to add new nodes		*/
        TreeNode GetDirectoryRootNode(string Path)
        {
            TreeNode   tn = new TreeNode(new DirectoryInfo(Path).Name);
            SHFileInfo bx = Shell32.StrIco(Path, _sys_lrg);

            tn.ImageIndex = tn.SelectedImageIndex = (int)bx.iIcon;
            User32.DestroyIcon(bx.hIcon);
            bx = new SHFileInfo();
            try
            {
                foreach (string s in Directory.GetDirectories(Path))
                {
                    DirectoryInfo di = new DirectoryInfo(s);
                    tn.Nodes.Add(GetDirectoryNode(s));
                }
            } catch (Exception exception) {
                Debug.Print("{0}: {1}, File: ‘{2}’", exception, Path, exception.Message);
            }
            return(tn);
        }
        public static Icon GetIcon(string path, bool isFile)
        {
            var flags = (uint)(SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_LARGEICON);
            var attribute = isFile ? (uint)FILE_ATTRIBUTE_FILE : (uint)FILE_ATTRIBUTE_DIRECTORY;
            var shfi = new SHFileInfo();
            var res = NativeMethods.SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags);

            if (res == IntPtr.Zero)
                throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());

            try
            {
                Icon.FromHandle(shfi.hIcon);
                return (Icon)Icon.FromHandle(shfi.hIcon).Clone();
            }
            finally
            {
                NativeMethods.DestroyIcon(shfi.hIcon);
            }
        }
        public int GetIconIndex(IntPtr path)
        {
            var    options  = SHGetFileInfoOptions.SysIconIndex | SHGetFileInfoOptions.Pidl;
            var    shfi     = new SHFileInfo();
            var    shfiSize = Marshal.SizeOf(shfi.GetType());
            IntPtr retVal   = Win32Api.SHGetFileInfo(path, FileAttributes.None, ref shfi, shfiSize, options);

            if (shfi.hIcon != IntPtr.Zero)
            {
                Win32Api.DestroyIcon(shfi.hIcon);
            }

            if (retVal.Equals(IntPtr.Zero))
            {
                throw new Win32Exception(Marshal.GetLastWin32Error());
            }
            else
            {
                return(shfi.iIcon);
            }
        }
Exemple #8
0
        void AddTVPath(string path)
        {
            tstb.Text = curpath;
            DirectoryInfo dii = new DirectoryInfo(path);
            TreeNode      tn1 = new TreeNode(dii.FullName);
            SHFileInfo    bs  = Shell32.StrIco(dii.FullName, _sys_ico_lrg);

            tn1.ImageIndex = tn1.SelectedImageIndex = (int)bs.iIcon;
            User32.DestroyIcon(bs.hIcon);
            string [] mantis;
            try { mantis = Directory.GetDirectories(path); foreach (string jj in mantis)
                  {
                      tn1.Nodes.Add(GetDirectoryNode(jj));
                  }
            }
            catch (Exception exception) {
                System.Diagnostics.Debug.Print("Error: {0}\n{1}", path, exception.Message);
            }
            tv.Nodes.Add(tn1);
            return;
        }
Exemple #9
0
        public static Icon GetIcon(string path, bool isFile)
        {
            var flags     = (uint)(SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_LARGEICON);
            var attribute = isFile ? (uint)FILE_ATTRIBUTE_FILE : (uint)FILE_ATTRIBUTE_DIRECTORY;
            var shfi      = new SHFileInfo();
            var res       = NativeMethods.SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags);

            if (res == IntPtr.Zero)
            {
                throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
            }

            try
            {
                Icon.FromHandle(shfi.hIcon);
                return((Icon)Icon.FromHandle(shfi.hIcon).Clone());
            }
            finally
            {
                NativeMethods.DestroyIcon(shfi.hIcon);
            }
        }
Exemple #10
0
        public static Icon GetIcon(string path, DraggedFileType type, IconSize size, ItemState state)
        {
            var flags = (uint)(Interop.SHGFI_ICON | Interop.SHGFI_USEFILEATTRIBUTES);

            var attribute = (uint)(object.Equals(type, DraggedFileType.Folder) ? Interop.FILE_ATTRIBUTE_DIRECTORY : Interop.FILE_ATTRIBUTE_FILE);

            if (object.Equals(type, DraggedFileType.Folder) && object.Equals(state, ItemState.Open))
            {
                flags += Interop.SHGFI_OPENICON;
            }
            if (object.Equals(size, IconSize.Small))
            {
                flags += Interop.SHGFI_SMALLICON;
            }
            else
            {
                flags += Interop.SHGFI_LARGEICON;
            }
            var shfi = new SHFileInfo();
            var res  = Interop.SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags);

            if (object.Equals(res, IntPtr.Zero))
            {
                throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
            }
            try
            {
                Icon.FromHandle(shfi.hIcon);
                return((Icon)Icon.FromHandle(shfi.hIcon).Clone());
            }
            catch
            {
                throw;
            }
            finally
            {
                Interop.DestroyIcon(shfi.hIcon);
            }
        }
Exemple #11
0
        /// <summary>
        /// 获取系统图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄
        /// </summary>
        /// <param name="path">文件名或路径名</param>
        /// <param name="dwAttr">文件信息</param>
        /// <param name="dwFlag">信息控制字</param>
        /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param>
        /// <returns>获取到的Icon对象</returns>
        private static Icon GetIcon(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag, out long imageIndex)
        {
            if (dwAttr == FileAttribute.Directory)
            {
                imageIndex = ErrorFolderIndex;
            }
            else
            {
                imageIndex = ErrorFileIndex;
            }
            SHFileInfo shfi   = new SHFileInfo();
            int        iTotal = (int)SHGetFileInfo(path, dwAttr, ref shfi, (uint)Marshal.SizeOf(shfi), dwFlag);
            //int iTotal = (int)SHGetFileInfo(path, 0, ref shfi, (uint)Marshal.SizeOf(shfi), dwFlag);
            Icon icon = null;

            if (iTotal > 0)
            {
                icon       = Icon.FromHandle(shfi.hIcon).Clone() as Icon;
                imageIndex = shfi.iIcon.ToInt64();
            }
            DestroyIcon(shfi.hIcon); //释放资源
            return(icon);
        }
        /// <summary>
        /// 获取磁盘驱动器图标
        /// </summary>
        /// <param name="driverMark">有效的磁盘标号,如C、D、I等等,不区分大小写</param>
        /// <param name="isSmallIcon">标识是获取小图标还是获取大图标</param>
        /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param>
        /// <returns>返回一个Icon类型的磁盘驱动器图标对象</returns>
        public static Icon GetDriverIcon(char driverMark, bool isSmallIcon, out long imageIndex)
        {
            imageIndex = ErrorDriverIndex;
            //非有效盘符,返回封装的磁盘图标
            if (driverMark < 'a' && driverMark > 'z' && driverMark < 'A' && driverMark > 'Z')
            {
                return(null);
            }

            string driverName = driverMark.ToString().ToUpper() + ":\\";

            SHFileInfo      shfi   = new SHFileInfo();
            SHFileInfoFlags uFlags = SHFileInfoFlags.Icon | SHFileInfoFlags.ShellIconSize |
                                     SHFileInfoFlags.UseFileAttributes;

            if (isSmallIcon)
            {
                uFlags |= SHFileInfoFlags.SmallIcon;
            }
            else
            {
                uFlags |= SHFileInfoFlags.LargeIcon;
            }
            int iTotal = (int)SHGetFileInfo(driverName, FileAttribute.Normal, ref shfi, (uint)Marshal.SizeOf(shfi),
                                            uFlags);
            //int iTotal = (int)SHGetFileInfo(driverName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags);
            Icon icon = null;

            if (iTotal > 0)
            {
                icon       = Icon.FromHandle(shfi.hIcon).Clone() as Icon;
                imageIndex = shfi.iIcon.ToInt64();
            }

            DestroyIcon(shfi.hIcon); //释放资源
            return(icon);
        }
Exemple #13
0
        public static Icon GetIcon(string path, bool isFile)
        {
            var    flags     = (uint)(SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_LARGEICON);
            var    attribute = isFile ? (uint)FILE_ATTRIBUTE_FILE : (uint)FILE_ATTRIBUTE_DIRECTORY;
            var    shfi      = new SHFileInfo();
            IntPtr res;

            try
            {
                res = NativeMethods.SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags);
            }
            catch (Exception e)
            {
                logger.Error(e, $"Unable to call SHGetFileInfo: {e.Message}");
                return(null);
            }

            if (res == IntPtr.Zero)
            {
                logger.Error(Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error()), "SHGetFileInfo returned zero");
                return(null);
            }

            try
            {
                return((Icon)Icon.FromHandle(shfi.hIcon).Clone());
            }
            catch (Exception e)
            {
                logger.Error(e, $"Failed to call Icon.FromHandle: {e.Message}");
                return(null);
            }
            finally
            {
                NativeMethods.DestroyIcon(shfi.hIcon);
            }
        }
Exemple #14
0
 private static extern IntPtr SHGetFileInfo(string pszPath, FileAttribute dwFileAttributes, ref SHFileInfo sfi, uint cbFileInfo, SHFileInfoFlags uFlags);
Exemple #15
0
 /// <summary>         
 /// 获取文件类型         
 /// </summary>         
 /// <param name="path">文件名</param>         
 /// <param name="dwAttr">文件信息</param>         
 /// <param name="dwFlag">信息控制字</param>        
 /// <returns></returns>         
 private static string GetTypeName(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag)
 {
     try
     {
         SHFileInfo fi = new SHFileInfo();
         int iTotal = (int)SHGetFileInfo(path, dwAttr, ref fi, 0, dwFlag);
         if (iTotal > 0)
         {
             return fi.szTypeName;
         }
         else
         {
             return "";
         }
     }
     catch
     {
         return "";
     }
 }
Exemple #16
0
 public static Icon GetIcon(string path, ItemType type, IconSize size, ItemState state)
 {
     var flags = (uint)(Interop.SHGFI_ICON | Interop.SHGFI_USEFILEATTRIBUTES);
     var attribute = (uint)(object.Equals(type, ItemType.Folder) ? Interop.FILE_ATTRIBUTE_DIRECTORY : Interop.FILE_ATTRIBUTE_FILE);
     if (object.Equals(type, ItemType.Folder) && object.Equals(state, ItemState.Open))
     {
         flags += Interop.SHGFI_OPENICON;
     }
     if (object.Equals(size, IconSize.Small))
     {
         flags += Interop.SHGFI_SMALLICON;
     }
     else
     {
         flags += Interop.SHGFI_LARGEICON;
     }
     var shfi = new SHFileInfo();
     var res = Interop.SHGetFileInfo(path, attribute, out shfi, (uint)Marshal.SizeOf(shfi), flags);
     if (object.Equals(res, IntPtr.Zero)) throw Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
     try
     {
         Icon.FromHandle(shfi.hIcon);
         return (Icon)Icon.FromHandle(shfi.hIcon).Clone();
     }
     catch
     {
         throw;
     }
     finally
     {
         Interop.DestroyIcon(shfi.hIcon);
     }
 }
 private static extern IntPtr SHGetFileInfo(string pszPath, FileAttribute dwFileAttributes, ref SHFileInfo sfi,
                                            uint cbFileInfo, SHFileInfoFlags uFlags);
Exemple #18
0
        static public IntPtr GetImageListPointer(string path, SHGFI flags)
        {
            SHFileInfo shinfo = new SHFileInfo();

            return(Shell32.SHGetFileInfo(path, 0, ref shinfo, SHFileInfo.struct_size, flags));
        }
 private static extern IntPtr SHGetFileInfo(IntPtr pidl, uint dwFileAttributes, ref SHFileInfo psfi, int cbFileInfo, uint uFlags);
        public static IntPtr GetIcon(string FileName)
        {
            var icon = IntPtr.Zero;
            var sfi = new SHFileInfo();

            var pidl = SHSimpleIDListFromPath(FileName);
            if ((pidl != IntPtr.Zero) && (FileName.Substring(0, 3) == "::{"))
            {
                SHGetFileInfo(pidl, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x1000 | 0x8); // SHGFI_ICONLOCATION | SHGFI_PIDL
                if (File.Exists(sfi.szDisplayName))
                {
                    FileName = sfi.szDisplayName;
                }
            }

            var ext = string.Empty;
            var i = FileName.LastIndexOf('.');
            if (i >= 0)
            {
                ext = FileName.Substring(i).ToLower();
            }
            if ((ext == ".exe") || (ext == ".ocx") || (ext == ".dll") || (ext == ".scr") || (ext == ".bin") || (ext == ".cpl"))
            {
                IntPtr hModule = LoadLibraryEx(FileName, IntPtr.Zero, 2/*LOAD_LIBRARY_AS_DATAFILE*/);
                if (hModule != IntPtr.Zero)
                {
                    if (sfi.iIcon >= 0)
                    {
                        EnumResourceName = string.Empty;
                        EnumResourceIndex = sfi.iIcon;
                        EnumResourceCounter = 0;
                        EnumResourceNames(hModule, 3 + 11/*DIFFERENCE*/, new EnumResNameProcDelegate(EnumResNameProc), IntPtr.Zero);
                    }
                    else
                    {
                        EnumResourceName = string.Format("#{0}", -sfi.iIcon);
                    }
                    icon = GetIcon(hModule, EnumResourceName);
                    FreeLibrary(hModule);
                }
            }
            else if ((ext == ".ico") || (ext == ".icon"))
            {
                var iconSize = GetIconSize(FileName);
                icon = LoadImage(IntPtr.Zero, FileName, 1, iconSize, iconSize, 0x10 | 0x2); // LR_LOADFROMFILE | LR_COLOR
            }

            if (icon == IntPtr.Zero)
            {
                var osInfo = new OSVersionInfo();
                osInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVersionInfo));
                GetVersionEx(ref osInfo);

                var iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");
                IImageList imageList = null;

                if ((osInfo.dwMajorVersion >= 6) && (SHGetImageList(4/*SHIL_JUMBO*/, ref iidImageList, ref imageList) >= 0))
                {
                    SHGetFileInfo(FileName, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x4000/*SHGFI_SYSICONINDEX*/);
                    imageList.GetIcon(sfi.iIcon, 0x20 | 0x1, ref icon); // ILD_IMAGE | ILD_TRANSPARENT
                    if(!AnalizeIcon256(icon))
			        {
				        DestroyIcon(icon);
				        icon = IntPtr.Zero;
			        }
                }

                if ((icon == IntPtr.Zero) && (SHGetImageList(2/*SHIL_EXTRALARGE*/, ref iidImageList, ref imageList) >= 0))
                {
                    SHGetFileInfo(FileName, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x4000/*SHGFI_SYSICONINDEX*/);
                    imageList.GetIcon(sfi.iIcon, 0x20 | 0x1, ref icon); // ILD_IMAGE | ILD_TRANSPARENT
                    if (icon == (IntPtr)(-1))
                    {
                        icon = IntPtr.Zero;
                    }
                }
            }

            if ((icon == IntPtr.Zero) && (pidl != IntPtr.Zero) && (SHGetFileInfo(pidl, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)),
                0x100 | 0x0 | 0x8) != IntPtr.Zero)) // SHGFI_ICON | SHGFI_LARGEICON | SHGFI_PIDL
            {
                icon = sfi.hIcon;
            }

            return icon;
        }
 public static extern IntPtr SHGetFileInfo(
     string pszPath,
     [MarshalAs(UnmanagedType.U4)] FileAttributes dwFileAttributes,
     ref SHFileInfo psfi,
     int cbFileInfo,
     [MarshalAs(UnmanagedType.U4)] SHFileInfoFlags uFlags);
Exemple #22
0
 private static extern Int32 SHGetFileInfo(String path, Int32 fileAttributes, out SHFileInfo fileInfo, UInt32 fileInfoSize, SHGetFileInfoFlags flags);
Exemple #23
0
 private static extern int SHGetFileInfoA(string pszPath, int dwFileAttributes, [InAttribute, OutAttribute] SHFileInfo psfi, int cbSizeFileInfo, int uFlags);
        /// <summary>    
        /// 获取系统文件夹默认图标  
        /// </summary>    
        /// <param name="folderName">文件夹名称,如果想获取自定义文件夹图标,请指定完整的文件夹名称(如 F:\test)</param>  
        /// <param name="isSmallIcon">是否返回小图标</param>  
        /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param>  
        /// <returns>返回一个Icon类型的文件夹图标对象</returns>  
        public static Icon GetFolderIcon(string folderName, bool isSmallIcon, out long imageIndex)
        {
            imageIndex = ErrorFolderIndex;
            if (String.IsNullOrEmpty(folderName))
                return null;

            SHFileInfo shfi = new SHFileInfo();
            SHFileInfoFlags uFlags = SHFileInfoFlags.Icon | SHFileInfoFlags.ShellIconSize | SHFileInfoFlags.UseFileAttributes;
            if (isSmallIcon)
                uFlags |= SHFileInfoFlags.SmallIcon;
            else
                uFlags |= SHFileInfoFlags.LargeIcon;

            int iTotal = (int)SHGetFileInfo(folderName, FileAttribute.Directory, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags);
            //或int iTotal = (int)SHGetFileInfo("", 0, ref shfi, (uint)Marshal.SizeOf(shfi), SHFileInfoFlags.Icon | SHFileInfoFlags.SmallIcon);
            Icon icon = null;
            if (iTotal > 0)
            {
                icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon;
                imageIndex = shfi.iIcon.ToInt64();
            }
            DestroyIcon(shfi.hIcon); //释放资源
            return icon;
        }
Exemple #25
0
            public static IntPtr ImgListPtr(string path, SHGFI flags)
            {
                SHFileInfo shinfo = new SHFileInfo();

                return(Shell32.SHGetFileInfo(path, 0, ref shinfo, (uint)Marshal.SizeOf(shinfo), flags));
            }
Exemple #26
0
 public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, out SHFileInfo psfi, uint cbFileInfo, uint uFlags);
 private static extern IntPtr SHGetFileInfo(IntPtr pidl, uint dwFileAttributes, ref SHFileInfo psfi, int cbFileInfo, uint uFlags);
 private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFileInfo psfi, int cbFileInfo, uint uFlags);
        private void AddFolderFilesList(List <FolderFile_data> list_ff, bool bool_ListFlag, string str_ff, string str_path)
        {
            var ffd = new FolderFile_data();

            ffd.str_Type   = str_ff;
            ffd.str_FFPath = str_path;

            if (str_ff.Equals("Directory"))
            {
                var di = new DirectoryInfo(str_path);

                ffd.image_Icon = new BitmapImage(new Uri(@"Images\folder.png", UriKind.Relative));
                ffd.str_FFName = di.Name;
                ffd.long_Size  = 0;
                ffd.str_SizeS  = "";

                list_ff.Add(ffd);

                if (bool_ListFlag)
                {
                    listBox_FolderFiles.Dispatcher.BeginInvoke(
                        new Action(() =>
                    {
                        listBox_FolderFiles.ItemsSource = list_ff;
                    }));
                }
            }
            else if (
                str_ff.Equals("File"))
            {
                var fi = new FileInfo(str_path);

                if (fi.Extension.ToLower().Equals(".bmp") ||
                    fi.Extension.ToLower().Equals(".gif") ||
                    fi.Extension.ToLower().Equals(".jpg") ||
                    fi.Extension.ToLower().Equals(".jpeg") ||
                    fi.Extension.ToLower().Equals(".png") ||
                    fi.Extension.ToLower().Equals(".tiff") ||
                    fi.Extension.ToLower().Equals(".ico"))
                {
                    ffd.image_Icon = new BitmapImage(new Uri(fi.FullName));
                }
                else
                {
                    ffd.image_Icon = SHFileInfo.GetBitmap(fi.FullName);
                }

                ffd.str_FFName = fi.Name;
                ffd.long_Size  = fi.Length;
                ffd.str_SizeS  = fi.Length.ToString("###,##0 Byte");

                list_ff.Add(ffd);

                if (bool_ListFlag)
                {
                    listBox_FolderFiles.Dispatcher.BeginInvoke(
                        new Action(() =>
                    {
                        listBox_FolderFiles.ItemsSource = list_ff;
                    }));
                }
            }
        }
Exemple #30
0
 private static extern IntPtr SHGetFileInfo(string pszPath, int dwFileAttributes, out SHFileInfo psfi, int cbFileInfo, int uFlags);
        /// <summary>  
        /// 获取系统文件图标  
        /// </summary>  
        /// <param name="fileName">文件类型的扩展名或文件的绝对路径,如果是一个exe可执行文件,请提供完整的文件名(包含路径信息)</param>  
        /// <param name="isSmallIcon">是否返回小图标</param>  
        /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param>  
        /// <returns>返回一个Icon类型的文件图标对象</returns>  
        public static Icon GetFileIcon(string fileName, bool isSmallIcon, out long imageIndex)
        {
            imageIndex = ErrorFileIndex;
            if (String.IsNullOrEmpty(fileName))
                return null;

            SHFileInfo shfi = new SHFileInfo();
            SHFileInfoFlags uFlags = SHFileInfoFlags.Icon | SHFileInfoFlags.ShellIconSize;
            if (isSmallIcon)
                uFlags |= SHFileInfoFlags.SmallIcon;
            else
                uFlags |= SHFileInfoFlags.LargeIcon;
            FileInfo fi = new FileInfo(fileName);
            if (fi.Name.ToUpper().EndsWith(".EXE"))
                uFlags |= SHFileInfoFlags.ExeType;
            else
                uFlags |= SHFileInfoFlags.UseFileAttributes;

            int iTotal = (int)SHGetFileInfo(fileName, FileAttribute.Normal, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags);
            Icon icon = null;
            if (iTotal > 0)
            {
                icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon;
                imageIndex = shfi.iIcon.ToInt64();
            }
            DestroyIcon(shfi.hIcon); //释放资源
            return icon;
        }
        public static IntPtr GetIcon(string FileName)
        {
            var icon = IntPtr.Zero;
            var sfi  = new SHFileInfo();

            var pidl = SHSimpleIDListFromPath(FileName);

            if ((pidl != IntPtr.Zero) && (FileName.Substring(0, 3) == "::{"))
            {
                SHGetFileInfo(pidl, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x1000 | 0x8); // SHGFI_ICONLOCATION | SHGFI_PIDL
                if (File.Exists(sfi.szDisplayName))
                {
                    FileName = sfi.szDisplayName;
                }
            }

            var ext = string.Empty;
            var i   = FileName.LastIndexOf('.');

            if (i >= 0)
            {
                ext = FileName.Substring(i).ToLower();
            }
            if ((ext == ".exe") || (ext == ".ocx") || (ext == ".dll") || (ext == ".scr") || (ext == ".bin") || (ext == ".cpl"))
            {
                IntPtr hModule = LoadLibraryEx(FileName, IntPtr.Zero, 2 /*LOAD_LIBRARY_AS_DATAFILE*/);
                if (hModule != IntPtr.Zero)
                {
                    if (sfi.iIcon >= 0)
                    {
                        EnumResourceName    = string.Empty;
                        EnumResourceIndex   = sfi.iIcon;
                        EnumResourceCounter = 0;
                        EnumResourceNames(hModule, 3 + 11 /*DIFFERENCE*/, new EnumResNameProcDelegate(EnumResNameProc), IntPtr.Zero);
                    }
                    else
                    {
                        EnumResourceName = string.Format("#{0}", -sfi.iIcon);
                    }
                    icon = GetIcon(hModule, EnumResourceName);
                    FreeLibrary(hModule);
                }
            }
            else if ((ext == ".ico") || (ext == ".icon"))
            {
                var iconSize = GetIconSize(FileName);
                icon = LoadImage(IntPtr.Zero, FileName, 1, iconSize, iconSize, 0x10 | 0x2); // LR_LOADFROMFILE | LR_COLOR
            }

            if (icon == IntPtr.Zero)
            {
                var osInfo = new OSVersionInfo();
                osInfo.dwOSVersionInfoSize = Marshal.SizeOf(typeof(OSVersionInfo));
                GetVersionEx(ref osInfo);

                var        iidImageList = new Guid("46EB5926-582E-4017-9FDF-E8998DAA0950");
                IImageList imageList    = null;

                if ((osInfo.dwMajorVersion >= 6) && (SHGetImageList(4 /*SHIL_JUMBO*/, ref iidImageList, ref imageList) >= 0))
                {
                    SHGetFileInfo(FileName, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x4000 /*SHGFI_SYSICONINDEX*/);
                    imageList.GetIcon(sfi.iIcon, 0x20 | 0x1, ref icon); // ILD_IMAGE | ILD_TRANSPARENT
                    if (!AnalizeIcon256(icon))
                    {
                        DestroyIcon(icon);
                        icon = IntPtr.Zero;
                    }
                }

                if ((icon == IntPtr.Zero) && (SHGetImageList(2 /*SHIL_EXTRALARGE*/, ref iidImageList, ref imageList) >= 0))
                {
                    SHGetFileInfo(FileName, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)), 0x4000 /*SHGFI_SYSICONINDEX*/);
                    imageList.GetIcon(sfi.iIcon, 0x20 | 0x1, ref icon); // ILD_IMAGE | ILD_TRANSPARENT
                    if (icon == (IntPtr)(-1))
                    {
                        icon = IntPtr.Zero;
                    }
                }
            }

            if ((icon == IntPtr.Zero) && (pidl != IntPtr.Zero) && (SHGetFileInfo(pidl, 0, ref sfi, Marshal.SizeOf(typeof(SHFileInfo)),
                                                                                 0x100 | 0x0 | 0x8) != IntPtr.Zero)) // SHGFI_ICON | SHGFI_LARGEICON | SHGFI_PIDL
            {
                icon = sfi.hIcon;
            }

            return(icon);
        }
        /// <summary>           
        /// 获取磁盘驱动器图标  
        /// </summary>           
        /// <param name="driverMark">有效的磁盘标号,如C、D、I等等,不区分大小写</param>           
        /// <param name="isSmallIcon">标识是获取小图标还是获取大图标</param>           
        /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param>           
        /// <returns>返回一个Icon类型的磁盘驱动器图标对象</returns>           
        public static Icon GetDriverIcon(char driverMark, bool isSmallIcon, out long imageIndex)
        {
            imageIndex = ErrorDriverIndex;
            //非有效盘符,返回封装的磁盘图标
            if (driverMark < 'a' && driverMark > 'z' && driverMark < 'A' && driverMark > 'Z')
            {
                return null;
            }
            string driverName = driverMark.ToString().ToUpper() + ":\\";

            SHFileInfo shfi = new SHFileInfo();
            SHFileInfoFlags uFlags = SHFileInfoFlags.Icon | SHFileInfoFlags.ShellIconSize | SHFileInfoFlags.UseFileAttributes;
            if (isSmallIcon)
                uFlags |= SHFileInfoFlags.SmallIcon;
            else
                uFlags |= SHFileInfoFlags.LargeIcon;
            int iTotal = (int)SHGetFileInfo(driverName, FileAttribute.Normal, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags);
            //int iTotal = (int)SHGetFileInfo(driverName, 0, ref shfi, (uint)Marshal.SizeOf(shfi), uFlags);
            Icon icon = null;
            if (iTotal > 0)
            {
                icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon;
                imageIndex = shfi.iIcon.ToInt64();
            }
            DestroyIcon(shfi.hIcon); //释放资源
            return icon;
        }
Exemple #34
0
 private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFileInfo psfi, uint cbSizeFileInfo, uint uFlags);
Exemple #35
0
 /// <summary>         
 /// 获取系统图标,不要试图释放由该方法返回的图标对象,因为它指向一个公共句柄         
 /// </summary>         
 /// <param name="path">文件名或路径名</param>         
 /// <param name="dwAttr">文件信息</param>         
 /// <param name="dwFlag">信息控制字</param>         
 /// <param name="imageIndex">输出与返回图标对应的系统图标索引号</param>         
 /// <returns>获取到的Icon对象</returns>         
 private static Icon GetIcon(string path, FileAttribute dwAttr, SHFileInfoFlags dwFlag, out long imageIndex)
 {
     if (dwAttr == FileAttribute.Directory)
     {
         imageIndex = ErrorFolderIndex;
     }
     else
     {
         imageIndex = ErrorFileIndex;
     }
     SHFileInfo shfi = new SHFileInfo();
     int iTotal = (int)SHGetFileInfo(path, dwAttr, ref shfi, (uint)Marshal.SizeOf(shfi), dwFlag);
     //int iTotal = (int)SHGetFileInfo(path, 0, ref shfi, (uint)Marshal.SizeOf(shfi), dwFlag);
     Icon icon = null;
     if (iTotal > 0)
     {
         icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon;
         imageIndex = shfi.iIcon.ToInt64();
     }
     DestroyIcon(shfi.hIcon); //释放资源
     return icon;
 }
Exemple #36
0
 public static extern IntPtr SHGetFileInfo(string path, uint fileAttributes, ref SHFileInfo fileInfo, int fileInfoSize, uint flags);
Exemple #37
0
 [DllImport(shell32)] static public extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFileInfo psfi, uint cbSizeFileInfo, SHGFI uFlags);