2011-06-08 61 views
2

我想在WPF应用程序中使用Window的ThumbnailCache。我开始了一个图像文件的路径,并希望最终得到一个包含缩略图的Media.Imaging.BitmapImage。如何访问WPF中的Windows ThumbnailCache?

我一直在拼凑事物,但我开始认为我走错了路。这感觉像很多代码来做什么应该是直截了当的。

我在这个错误的轨道上吗?

public BitmapImage Thumbnail { get; set; } 

    private void LoadThumbnail() 
    { 
     IShellItem shellItem; 
     SHCreateItemFromParsingName(FilePath, IntPtr.Zero, typeof(IShellItem).GUID, out shellItem); 

     IntPtr hBitmap = IntPtr.Zero; 
     ((IShellItemImageFactory)shellItem).GetImage(new SIZE(256, 256), 0x0, out hBitmap); 

     try 
     { 
      BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
       hBitmap, 
       IntPtr.Zero, 
       Int32Rect.Empty, 
       BitmapSizeOptions.FromEmptyOptions()); 

      BitmapImage bitmapImage = new BitmapImage(); 

      ??? BitmapImage from BitmapSource... 

      Thumbnail = bitmapImage; 
     } 
     finally 
     { 
      DeleteObject(hBitmap); 
     } 
    } 




    [DllImport("shell32.dll", CharSet = CharSet.Unicode, PreserveSig = false)] 
    public static extern void SHCreateItemFromParsingName(
     [In][MarshalAs(UnmanagedType.LPWStr)] string pszPath, 
     [In] IntPtr pbc, 
     [In][MarshalAs(UnmanagedType.LPStruct)] Guid riid, 
     [Out][MarshalAs(UnmanagedType.Interface, IidParameterIndex = 2)] out IShellItem ppv); 

    [ComImportAttribute()] 
    [GuidAttribute("bcc18b79-ba16-442f-80c4-8a59c30c463b")] 
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IShellItemImageFactory 
    { 
     void GetImage(
     [In, MarshalAs(UnmanagedType.Struct)] SIZE size, 
     [In] SIIGBF flags, 
     [Out] out IntPtr phbm); 
    } 

    [ComImport] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    [Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe")] 
    public interface IShellItem 
    { 
     void BindToHandler(IntPtr pbc, 
      [MarshalAs(UnmanagedType.LPStruct)]Guid bhid, 
      [MarshalAs(UnmanagedType.LPStruct)]Guid riid, 
      out IntPtr ppv); 

     void GetParent(out IShellItem ppsi); 

     void GetDisplayName(SIGDN sigdnName, out IntPtr ppszName); 

     void GetAttributes(uint sfgaoMask, out uint psfgaoAttribs); 

     void Compare(IShellItem psi, uint hint, out int piOrder); 
    }; 

    [StructLayout(LayoutKind.Sequential)] 
    public struct SIZE 
    { 
     public int cx; 
     public int cy; 

     public SIZE(int cx, int cy) 
     { 
      this.cx = cx; 
      this.cy = cy; 
     } 
    } 

    [Flags] 
    public enum SIIGBF 
    { 
     SIIGBF_RESIZETOFIT = 0x00, 
     SIIGBF_BIGGERSIZEOK = 0x01, 
     SIIGBF_MEMORYONLY = 0x02, 
     SIIGBF_ICONONLY = 0x04, 
     SIIGBF_THUMBNAILONLY = 0x08, 
     SIIGBF_INCACHEONLY = 0x10, 
    } 

    public enum SIGDN : uint 
    { 
     NORMALDISPLAY = 0, 
     PARENTRELATIVEPARSING = 0x80018001, 
     PARENTRELATIVEFORADDRESSBAR = 0x8001c001, 
     DESKTOPABSOLUTEPARSING = 0x80028000, 
     PARENTRELATIVEEDITING = 0x80031001, 
     DESKTOPABSOLUTEEDITING = 0x8004c000, 
     FILESYSPATH = 0x80058000, 
     URL = 0x80068000 
    } 

    [System.Runtime.InteropServices.DllImport("gdi32.dll")] 
    public static extern bool DeleteObject(IntPtr hObject); 

回答

1

有一个开源库,用于阅读的Thumbs.db文件可以在这里找到:

http://www.petedavis.net/drupal//index.php?q=node/2

它包括完整的源代码。可能比尝试自己动手更容易!

+1

感谢您的指针。看起来这个库是针对XP的。 Vista和更高版本包含一个ThumbnailCache,它可以替代XP的每个文件夹缩略图数据库。更多信息:http://msdn.microsoft.com/en-us/library/bb774628(v=vs.85).aspx – Tristan 2011-06-08 15:58:55