获取图标 WPF 代码在 CD-ROM 上不起作用
Get Icon WPF code not working on 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 对象确实有一个 'downloading' 事件。但是我已经逐步完成了代码并且没有被击中。
这似乎也是一个 'caching' 问题。但奇怪的是只影响 CD-Rom 图标?
所以我什至付钱请人帮助我在其中一个网站上找到专家。我们一起工作了一段时间,没有找到好的解决方案。
最后我们发现 'Shell-API' 会在无法写入受保护驱动器的任何时候报告 GDI+ 错误。 (无论如何,这是我最接近的猜测。)所以我想出的 'imperfect' 解决方案是:顺便说一句......这不使用 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 中获取图标总是很慢。
注意:我尝试在此过程中执行 'File-Delete'。但是那个爆炸......你可能必须等到用户注销才能让这些临时文件消失。
这是非常标准的代码:
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 对象确实有一个 'downloading' 事件。但是我已经逐步完成了代码并且没有被击中。
这似乎也是一个 'caching' 问题。但奇怪的是只影响 CD-Rom 图标?
所以我什至付钱请人帮助我在其中一个网站上找到专家。我们一起工作了一段时间,没有找到好的解决方案。
最后我们发现 'Shell-API' 会在无法写入受保护驱动器的任何时候报告 GDI+ 错误。 (无论如何,这是我最接近的猜测。)所以我想出的 'imperfect' 解决方案是:顺便说一句......这不使用 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 中获取图标总是很慢。
注意:我尝试在此过程中执行 'File-Delete'。但是那个爆炸......你可能必须等到用户注销才能让这些临时文件消失。