2015-11-18 4 views
0

Это довольно стандартный код:Скачать иконку WPF код не работает на 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()); 
    } 

Он работает все время, кроме случаев, когда пытаются увидеть значки (в частности, WMV) иконки на компакт-диске. Нужно ли больше времени для загрузки? Или что-то ... У объекта Bitmapsource есть событие «загрузки». Но я прошел через код, и это не ударит.

Возможно, это также может быть проблемой «кэширования». Но странно только влияет на иконки CD-Rom?

ответ

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. Затем я использую «WinAPI-Shell-Factory» для получения Thumbnail. Бум это работает. Это медленно, но получение значка с CD-Rom всегда медленное.

Примечание: в этой процедуре я попытался выполнить «File-Delete». Но это взорвалось ... Возможно, вам придется подождать, пока пользователь не выйдет из системы, чтобы эти временные файлы исчезли.