Beispiel #1
0
        /// <summary>
        /// 指定されたパスのアイコンを取得する
        /// </summary>
        /// <param name="path">アイコン取得対象のパス</param>
        /// <param name="size">
        /// 取得するアイコンのサイズ
        /// </param>
        /// <param name="isExist">
        /// ファイルが実在する場合だけアイコンを取得する場合 true、実在しなくても拡張子から取得する場合 false
        /// </param>
        /// <returns>取得されたアイコンをIconクラスで返す</returns>
        public static Icon GetFileAssociatedIcon(string path, EIconSize size, bool isExist)
        {
            SHFILEINFO fileInfo = new SHFILEINFO();
            uint       flags    = Shell32Wrapper.SHGFI_ICON;

            if (size == EIconSize.Small)
            {
                flags |= Shell32Wrapper.SHGFI_SMALLICON;
            }
            if (!isExist)
            {
                flags |= Shell32Wrapper.SHGFI_USEFILEATTRIBUTES;
            }
            try
            {
                // アイコンの取得
                Shell32Wrapper.SHGetFileInfo(path, 0, ref fileInfo, (uint)Marshal.SizeOf(fileInfo), flags);
                if (fileInfo.hIcon == IntPtr.Zero)
                {
                    return(null);
                }
                else
                {
                    var unmanagedIcon = Icon.FromHandle(fileInfo.hIcon);
                    return(new Icon(unmanagedIcon, unmanagedIcon.Size)); // unmanagedIconは破棄されるのでManagedで新しく作成する
                }
            }
            finally
            {
                if (fileInfo.hIcon != IntPtr.Zero)
                {
                    User32Wrapper.DestroyIcon(fileInfo.hIcon);
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// 指定した特殊フォルダのアイコンイメージを取得する
        /// </summary>
        /// <param name="targetFolder">アイコンイメージ取得対象の特殊フォルダを指すenum</param>
        /// <param name="size">
        /// 取得するアイコンのサイズ
        /// </param>
        /// <returns>取得されたアイコンをIconクラスで返す</returns>
        public static Icon GetSpecialFolderAssociatedImage(SpecialFolderID targetFolder, EIconSize size)
        {
            uint flags = Shell32Wrapper.SHGFI_ICON | Shell32Wrapper.SHGFI_PIDL;

            if (size == EIconSize.Small)
            {
                flags |= Shell32Wrapper.SHGFI_SMALLICON;
            }
            SHFILEINFO fileInfo = new SHFILEINFO();
            IntPtr     pidlRoot = IntPtr.Zero;

            try
            {
                // 特殊フォルダのpIDLを取得
                Shell32Wrapper.SHGetSpecialFolderLocation(IntPtr.Zero, (int)targetFolder, out pidlRoot);

                // アイコンの取得
                Shell32Wrapper.SHGetFileInfo(pidlRoot, 0, ref fileInfo, (uint)Marshal.SizeOf(fileInfo), flags);
                if (fileInfo.hIcon == IntPtr.Zero)
                {
                    return(null);
                }
                else
                {
                    var unmanagedIcon = Icon.FromHandle(fileInfo.hIcon);
                    return(new Icon(unmanagedIcon, unmanagedIcon.Size)); // unmanagedIconは破棄されるのでManagedで新しく作成する
                }
            }
            finally
            {
                if (fileInfo.hIcon != IntPtr.Zero)
                {
                    User32Wrapper.DestroyIcon(fileInfo.hIcon);
                }

                // pidlを解放する。
                if (pidlRoot != IntPtr.Zero)
                {
                    IMalloc malloc = GetSHMalloc();
                    malloc.Free(pidlRoot);
                }
            }
        }