private static BitmapSource GetSystemIconImage(HierarchyItemIdentity item) { IVsProject project = item.NestedHierarchy as IVsProject; if (project != null) { string document; if (ErrorHandler.Succeeded(project.GetMkDocument(item.NestedItemID, out document))) { SHFILEINFO shfi = new SHFILEINFO(); uint cbFileInfo = (uint)Marshal.SizeOf(shfi); IntPtr systemImageList = NativeMethods.SHGetFileInfo(document, 0, ref shfi, cbFileInfo, SHGFI.SysIconIndex | SHGFI.SmallIcon); if (systemImageList == IntPtr.Zero) { systemImageList = NativeMethods.SHGetFileInfo(document, 0, ref shfi, cbFileInfo, SHGFI.SysIconIndex | SHGFI.SmallIcon | SHGFI.UseFileAttributes); } if (systemImageList != IntPtr.Zero) { NativeImageList imageList = new NativeImageList(systemImageList); return(imageList.GetImage(shfi.iIcon)); } } } return(null); }
private static BitmapSource GetImageFromHierarchy(HierarchyItemIdentity item, int iconIndexProperty, int iconHandleProperty) { int iconIndex; IntPtr iconHandle; IntPtr iconImageList; BitmapSource iconBitmapSource = null; IVsHierarchy iconSourceHierarchy = item.Hierarchy; uint iconSourceItemid = item.ItemID; if (item.IsNestedItem) { bool useNestedHierarchyIconList; if (TryGetHierarchyProperty(item.Hierarchy, item.ItemID, (int)__VSHPROPID2.VSHPROPID_UseInnerHierarchyIconList, out useNestedHierarchyIconList) && useNestedHierarchyIconList) { iconSourceHierarchy = item.NestedHierarchy; iconSourceItemid = item.NestedItemID; } } if (TryGetHierarchyProperty(iconSourceHierarchy, iconSourceItemid, iconIndexProperty, out iconIndex) && TryGetHierarchyProperty(iconSourceHierarchy, VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_IconImgList, UnboxAsIntPtr, out iconImageList)) { NativeImageList imageList = new NativeImageList(iconImageList); iconBitmapSource = imageList.GetImage(iconIndex); } else if (TryGetHierarchyProperty(item.Hierarchy, item.ItemID, iconHandleProperty, UnboxAsIntPtr, out iconHandle)) { // Don't call DestroyIcon on iconHandle, as it's a shared resource owned by the hierarchy iconBitmapSource = Imaging.CreateBitmapSourceFromHIcon(iconHandle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); iconBitmapSource.Freeze(); } if (iconBitmapSource == null) { iconBitmapSource = GetSystemIconImage(item); } return(iconBitmapSource); }