0

这是非常标准的代码:

 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 图标?

4

1 回答 1

0

所以我什至花钱请人帮我上一个你可以得到专家的网站。我们一起工作了一段时间,没有找到好的解决方案。

最后,我们发现“Shell-API”在无法写入受保护驱动器的任何时候都会报告 GDI+ 错误。(无论如何,这是我最接近的猜测。)所以我想出的“不完美”解决方案是:顺便说一句......这不使用 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;

所以我只是将文件移动到临时文件中。然后我使用“WinAPI-Shell-Factory”从中获取缩略图。繁荣它的工作原理。它很慢,但是从 CD-Rom 上获取图标总是很慢。

注意:我尝试在此过程中执行“文件删除”。但这爆炸了......您可能必须等到用户注销这些临时文件才能消失。

于 2015-11-30T14:06:56.613 回答