/// <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); } } }
/// <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); } } }