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

だから私はあなたが専門家を得ることができるそれらのサイトの1つで私を助けるために男にさえ支払いました. 私たちはしばらく一緒に働きましたが、良い解決策を見つけることができませんでした。

最後に、「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 に答える