プレビューハンドラは MSDN Magazine で扱われてるからいいけど、サムネイルプロバイダ*1は情報が少ないのでメモ。
嘘書いてるかもしれないのでツッコミ歓迎。
実装メモ
基本的には IThumbnailProvider と IInitializeWithStream、IInitializeWithItem、IInitializeWithFile のどれかを実装すればいい。
IThumbnailProvider
IThumbnailProvider は GetThumbnail 1つのメソッドしか持たない。
HRESULT GetThumbnail( UINT cx, HBITMAP *phbmp, WTS_ALPHATYPE *pdwAlpha );
と引数が定義されていて、それぞれの引数の意味は
- cx : 要求されてるサムネイルのサイズ。
- phbmp : 作成したビットマップのハンドル。DIB の 32ビットじゃないとダメ。
- pdwAlpha : ビットマップハンドルがアルファチャンネルを含んでるかどうか指定する。
- WTSAT_UNKNOWN : シェルが自動判別する?
- WTSAT_RGB : アルファチャンネルを含まない。
- WTSAT_ARGB : アルファチャンネルを含む。
System.Drawing.Bitmap の GetHbitmap で作成したビットマップハンドルをそのまま使えるかどうかは未確認。
IInitializeWithStream, IInitializeWithFile, IInitializeWithItem
IInitializeWithStream と IInitializeWithFile については
を見た方が圧倒的にいいので省略。Initialize メソッドを実装すればいいだけらしい。
IInitializeWithItem は Initialize メソッドの引数の型が IShellItem になっただけ。ちなみに IInitializeWithStream は IStream、IInitializeWithFile は LPCWSTR になっている。
IStream は System.Runtime.InteropService.ComTypes にマネージ型が提供されてるので、IShellItem が引数のこのインターフェースは使いにくそう。
この 3 種類から 1 つのインターフェースを実装しておかないと、どのファイルのサムネイルが必要なのか分からなくなる。
*1:ライブアイコンとも呼ばれるもの