예제 #1
0
        private int GetIconIndex(string fileName, bool isDirectory, bool forceLoadFromDisk, ShellIconStateConstants iconState)
        {
            NativeMethods.SHGetFileInfoConstants dwFlags; uint dwAttr;
            GetAttributes(isDirectory, forceLoadFromDisk, out dwAttr, out dwFlags);

            // sFileSpec can be any file.

            if (fileName.EndsWith(".lnk", StringComparison.InvariantCultureIgnoreCase))
            {
                dwFlags          |= NativeMethods.SHGetFileInfoConstants.SHGFI_LINKOVERLAY | NativeMethods.SHGetFileInfoConstants.SHGFI_ICON;
                iconState         = ShellIconStateConstants.ShellIconStateLinkOverlay;
                forceLoadFromDisk = true;
            }

            var shfi     = new NativeMethods.SHFILEINFO();
            var shfiSize = (uint)Marshal.SizeOf(shfi.GetType());
            var retVal   = NativeMethods.SHGetFileInfo(fileName, dwAttr, ref shfi, shfiSize, ((uint)(dwFlags) | (uint)iconState));

            if (!retVal.Equals(IntPtr.Zero))
            {
                return(shfi.iIcon.ToInt32());
            }
            if (forceLoadFromDisk)
            {
                return(GetIconIndex(Path.GetFileName(fileName), isDirectory, false, iconState));
            }
            Debug.Assert((!retVal.Equals(IntPtr.Zero)), "Failed to get icon index");
            return(-1);
        }
예제 #2
0
        public static IntPtr Test()
        {
            var shfi     = new NativeMethods.SHFILEINFO();
            var shfiSize = (uint)Marshal.SizeOf(shfi.GetType());

            return(NativeMethods.SHGetFileInfo(@"C:\", 16, ref shfi, shfiSize, 16384));
        }
예제 #3
0
        private int GetIconIndex(IntPtr pidlPtr, bool isDirectory, bool forceLoadFromDisk, ShellIconStateConstants iconState)
        {
            NativeMethods.SHGetFileInfoConstants dwFlags; uint dwAttr;
            GetAttributes(isDirectory, forceLoadFromDisk, out dwAttr, out dwFlags);
            dwFlags |= NativeMethods.SHGetFileInfoConstants.SHGFI_PIDL;

            var shfi     = new NativeMethods.SHFILEINFO();
            var shfiSize = (uint)Marshal.SizeOf(shfi.GetType());
            var retVal   = NativeMethods.SHGetFileInfo(pidlPtr, dwAttr, ref shfi, shfiSize, ((uint)(dwFlags) | (uint)iconState));

            if (!retVal.Equals(IntPtr.Zero))
            {
                return(shfi.iIcon.ToInt32());
            }
            Debug.Assert((!retVal.Equals(IntPtr.Zero)), "Failed to get icon index");
            return(-1);
        }
예제 #4
0
        /// <summary>
        ///  Gets the information for the specified
        ///  file name and flags.
        /// </summary>
        public void GetInfo()
        {
            fileIcon    = null;
            typeName    = "";
            displayName = "";

            NativeMethods.SHFILEINFO shfi = new NativeMethods.SHFILEINFO();
            uint shfiSize = (uint)Marshal.SizeOf(shfi.GetType());

            IntPtr ret = NativeMethods.SHGetFileInfo(
                fileName, 0, ref shfi, shfiSize, (uint)(flags));

            if (ret != IntPtr.Zero)
            {
                if (shfi.hIcon != IntPtr.Zero)
                {
                    fileIcon = System.Drawing.Icon.FromHandle(shfi.hIcon);
                    // Now owned by the GDI+ object
                    //DestroyIcon(shfi.hIcon);
                }
                typeName    = shfi.szTypeName;
                displayName = shfi.szDisplayName;
            }
            else
            {
                int err = NativeMethods.GetLastError();
                Console.WriteLine("Error {0}", err);
                string txtS = new string('\0', 256);
                int    len  = NativeMethods.FormatMessage(
                    NativeMethods.FORMAT_MESSAGE_FROM_SYSTEM | NativeMethods.FORMAT_MESSAGE_IGNORE_INSERTS,
                    IntPtr.Zero, err, 0, txtS, 256, 0);
                Console.WriteLine("Len {0} text {1}", len, txtS);

                // throw exception
            }
        }
예제 #5
0
        private int GetIconIndex(IntPtr pidlPtr, bool isDirectory, bool forceLoadFromDisk, ShellIconStateConstants iconState)
        {
            NativeMethods.SHGetFileInfoConstants dwFlags; uint dwAttr;
            GetAttributes(isDirectory, forceLoadFromDisk, out dwAttr, out dwFlags);
            dwFlags |= NativeMethods.SHGetFileInfoConstants.SHGFI_PIDL;

            var shfi = new NativeMethods.SHFILEINFO();
            var shfiSize = (uint)Marshal.SizeOf(shfi.GetType());
            var retVal = NativeMethods.SHGetFileInfo(pidlPtr, dwAttr, ref shfi, shfiSize, ((uint)(dwFlags) | (uint)iconState));

            if (!retVal.Equals(IntPtr.Zero)) return shfi.iIcon.ToInt32();
            Debug.Assert((!retVal.Equals(IntPtr.Zero)), "Failed to get icon index");
            return -1;
        }
예제 #6
0
        private int GetIconIndex(string fileName, bool isDirectory, bool forceLoadFromDisk, ShellIconStateConstants iconState)
        {
            NativeMethods.SHGetFileInfoConstants dwFlags; uint dwAttr;
            GetAttributes(isDirectory, forceLoadFromDisk, out dwAttr, out dwFlags);

            // sFileSpec can be any file.

            if (fileName.EndsWith(".lnk", StringComparison.InvariantCultureIgnoreCase))
            {
                dwFlags |= NativeMethods.SHGetFileInfoConstants.SHGFI_LINKOVERLAY | NativeMethods.SHGetFileInfoConstants.SHGFI_ICON;
                iconState = ShellIconStateConstants.ShellIconStateLinkOverlay;
                forceLoadFromDisk = true;
            }

            var shfi = new NativeMethods.SHFILEINFO();
            var shfiSize = (uint)Marshal.SizeOf(shfi.GetType());
            var retVal = NativeMethods.SHGetFileInfo(fileName, dwAttr, ref shfi, shfiSize, ((uint)(dwFlags) | (uint)iconState));

            if (!retVal.Equals(IntPtr.Zero)) return shfi.iIcon.ToInt32();
            if (forceLoadFromDisk)
                return GetIconIndex(Path.GetFileName(fileName), isDirectory, false, iconState);
            Debug.Assert((!retVal.Equals(IntPtr.Zero)), "Failed to get icon index");
            return -1;
        }
예제 #7
0
 public static IntPtr Test()
 {
     var shfi = new NativeMethods.SHFILEINFO();
     var shfiSize = (uint)Marshal.SizeOf(shfi.GetType());
     return NativeMethods.SHGetFileInfo(@"C:\", 16, ref shfi, shfiSize, 16384);
 }