获取图标WPF代码无法在CD-ROM上工作
本文关键字:CD-ROM 工作 图标 WPF 代码 获取 | 更新日期: 2023-09-27 18:22:45
这是非常标准的代码:
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图标?
所以我甚至花钱请了一个人在其中一个网站上帮我,你可以找到一位专家。我们一起工作了一段时间,没有找到一个好的解决方案。
最后,我们发现"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外壳工厂"从中获取缩略图。砰的一声,它就工作了。这很慢,但从CD-Rom中取出图标总是很慢。
注意:我尝试在这个过程中执行"文件删除"。但它爆炸了。。。您可能需要等到用户注销后,这些临时文件才会消失。