获取图标WPF代码无法在CD-ROM上运行

时间:2015-11-18 22:34:26

标签: c# wpf caching icons cd-rom

这是非常标准的代码:

 public static System.Windows.Media.Imaging.BitmapSource GetIcon(string Path, int Width = 256, int Height = 256)
    {
        IShellItem ppsi = null;
        IntPtr hbitmap = IntPtr.Zero;
        Guid uuid = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");

        SHCreateItemFromParsingName(Path, IntPtr.Zero, uuid, ref ppsi);
        ((IShellItemImageFactory)ppsi).GetImage(new SIZE(Width, Height), SIIGBF.SIIGBF_RESIZETOFIT, ref hbitmap);
        return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hbitmap, IntPtr.Zero, System.Windows.Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
    }

除了尝试在CD-ROM上查看图标(特别是WMV)图标外,它始终有效。是否需要更多时间下载?或者其他东西...... Bitmapsource对象确实有一个'下载'事件。但是我已经完成了代码并且没有被击中。

似乎这也可能是一个“缓存”。问题。但奇怪的是只影响CD-Rom图标?

1 个答案:

答案 0 :(得分:0)

所以我甚至付了一个人来帮助我找到一个你可以找专家的网站。我们一起工作了一段时间,无法找到一个好的解决方案。

最后我们发现了' Shell-API'只要它无法写入受保护的驱动器,它就会报告GDI +错误。 (无论如何,这是我最接近的猜测。)所以'不完美'我想出的解决方案是:BTW ......这不使用WPF。

        string tempfile = Path.ChangeExtension(Path.GetTempFileName(), Path.GetExtension(filename));
        File.Copy(filename, tempfile);
        IShellItem2 ppsi = null;
        IntPtr hbitmap = IntPtr.Zero;
        // GUID of IShellItem.
        Guid uuid = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");
        ShellHelper.SHCreateItemFromParsingName(tempfile, IntPtr.Zero, ref uuid, out ppsi);
        ((IShellItemImageFactory)ppsi).GetImage(new SIZE(cx, cx), 0x0, out hbitmap);
        Bitmap result = Bitmap.FromHbitmap(hbitmap);
        return result;

所以我只是将文件移动到Temp-File中。然后我使用' WinAPI-Shell-Factory'从中获取缩略图。它有效。它很慢,但从CD-ROM获取一个图标总是很慢。

注意:我试图进行“文件删除”功能。在这个程序中。但是那个爆炸......你可能要等到用户注销这些临时文件才会消失。