|
分類:[C# (Windows)]
エクスプローラーで「表示→縮小版」を選択した際に表示されるサムネイルを取得する
方法として、IExtractImageを用いました。
パワーポイントもエクセルもワードも動画ファイルもエクスプローラで「縮小版」時に
サムネイルが出る物ならなんでもとれるようになった・・・と思ったのですが、
何故かPDFだけ、取得できません。エクスプローラ上ではサムネイルが表示されているのですが・・・
素材の元にさせていただいたVB6のアプリでちゃんとPDFのサムネイルもとれるのですが・・・
(そのVB6のソースをC#に変換したつもりなのですが・・・)
いろいろ調べたつもりなのですが、どうしてもわかりません。
ご教授いただけないでしょうか。よろしくお願いします。
private bool showThumbnail(string fileName)
{
IShellFolder ishell = null;
string folder = "";
System.IntPtr ppidl;
uint pdwAttributes = 0;
uint pchEaten = 0;
IExtractImage ieimg = null;
IntPtr phBmpThumbnail = IntPtr.Zero;
folder = fileName.Substring(0,fileName.LastIndexOf("\\"))+"\\";
fileName = fileName.Substring(fileName.LastIndexOf("\\")+1);
ishell = ShellFunctions.GetDesktopFolder();
ishell.ParseDisplayName(IntPtr.Zero,System.IntPtr.Zero,folder,ref pchEaten ,out ppidl,ref pdwAttributes);
if (ppidl!=System.IntPtr.Zero)
{
mobjDesktop.BindToObject(ppidl,System.IntPtr.Zero,ref rid,ref ishell);
ShellFunctions.GetMalloc().Free(ppidl);
ppidl=System.IntPtr.Zero;
}
if (ishell==null)
{
return false;
}
ishell.ParseDisplayName(IntPtr.Zero,IntPtr.Zero,fileName,ref pchEaten,out ppidl,ref pdwAttributes);
pchEaten = 0;
if (ppidl!=IntPtr.Zero)
{
ishell.GetUIObjectOf(IntPtr.Zero, 1, ref ppidl, ref irid, ref pchEaten, out ieimg);
if (ieimg!=null)
{
StringBuilder sb = new StringBuilder(1024);
SIZE size = new SIZE();
size.cx = 96;
size.cy = 96;
int pdwPriority = 0;
int pdwFlags = (int)(EIEIFLAG.IEIFLAG_ORIGSIZE|EIEIFLAG.IEIFLAG_SCREEN);;
ieimg.GetLocation(sb,sb.Capacity,ref pdwPriority,ref size,32,ref pdwFlags);
this.label1.Text = sb.ToString();
ieimg.Extract(out phBmpThumbnail);
}
ShellFunctions.GetMalloc().Free(ppidl);
}
if (phBmpThumbnail!=IntPtr.Zero)
{
Image img = null;
if (this.pictureBox1.Image!=null)
{
img = this.pictureBox1.Image;
this.pictureBox1.Image = null;
img.Dispose();
}
img = Image.FromHbitmap(phBmpThumbnail);
this.pictureBox1.Image = img;
}
if (ishell!=null)
{
Marshal.ReleaseComObject(ishell);
}
if (ieimg!=null)
{
Marshal.ReleaseComObject(ieimg);
}
return true;
}
|