问题描述
每个已安装的OS内都有许多内置的ThumbnailProvider.由于这些提供商,Windows能够显示许多文件的缩略图.例如,Windows资源管理器可以显示* .jpg文件的内容,但也可以显示Solidworks * .sldprt文件的内容(如果已安装SolidWorks).
There is a lot of build-in ThumbnailProviders inside every installed OS. Due to these providers Windows is able to show Thumbnail of many files. For example Windows Explorer can show content of *.jpg files, but from Solidworks *.sldprt files too (If SolidWorks is installed).
但是有什么方法可以获取这些缩略图吗?我曾尝试使用Windows API CodecPack来管理此问题,但仅在Windows 7上成功.
But is there any way to get these thumbnails? I´ve tried to manage this using Windows API CodecPack, but I succeeded only on Windows 7.
ShellFile shellFile = ShellFile.FromFilePath(filePath);
Bitmap shellThumb = shellFile.Thumbnail.Bitmap;
问题是:在Windows XP/Vista上,是否有其他可用方法通过注册的缩略图提供程序获取任何文件的缩略图?我真的很绝望...
Question is: is there any other usable way to get Thumbnail of any file with registered Thumbnail provider on Windows XP/Vista? I´m really desperate...
推荐答案
有几种方法:
1)使用库 OpenMCDF .Solidworks文件是复合文档,因此对其内容的访问-正在解析该文件.
1) With library OpenMCDF.Solidworks file is Compound document so access to its content - is parsing the file.
OpenFileDialog dialog = new OpenFileDialog();
dialog.InitialDirectory = Application.StartupPath;
if (dialog.ShowDialog() == DialogResult.OK)
{
string STORAGE_NAME = dialog.FileName.ToString();
CompoundFile cf = new CompoundFile(STORAGE_NAME);
CFStream st = cf.RootStorage.GetStream("PreviewPNG");
byte[] buffer = st.GetData();
var ms = new MemoryStream(buffer.ToArray());
pictureBox1.Image = Image.FromStream(ms);
}
2)使用库EModelView.dll作为控件添加并放置到窗体中.
2) With library EModelView.dll to be added as a control and placed to the Form.
OpenFileDialog dialog = new OpenFileDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
axEModelViewControl1.OpenDoc(dialog.FileName.ToString(), false, false, true, "");
}
3)使用SWExplorer库(wpfPreviewFlowControl)
3) With SWExplorer library (wpfPreviewFlowControl)
OpenFileDialog dialog = new OpenFileDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
string sDocFileName = dialog.FileName.ToString();
wpfThumbnailCreator pvf;
pvf = new wpfThumbnailCreator();
System.Drawing.Size size = new Size();
size.Width = 200;
size.Height = 200;
pvf.DesiredSize = size;
System.Drawing.Bitmap pic = pvf.GetThumbNail(sDocFileName);
pictureBox1.Image = pic;
}
3)使用库文档管理器(SolidWorks.Interop.swdocumentmgr)
3) With library Document Manager (SolidWorks.Interop.swdocumentmgr)
OpenFileDialog dialog = new OpenFileDialog();
if (dialog.ShowDialog() == DialogResult.OK)
{
string sDocFileName = dialog.FileName.ToString();
SwDMClassFactory swClassFact = default(SwDMClassFactory);
SwDMApplication swDocMgr = default(SwDMApplication);
SwDMDocument swDoc = default(SwDMDocument);
SwDMConfigurationMgr swCfgMgr = default(SwDMConfigurationMgr);
string[] vCfgNameArr = null;
SwDMConfiguration7 swCfg = default(SwDMConfiguration7);
IPictureDisp pPreview = default(IPictureDisp);
SwDmDocumentType nDocType = 0;
SwDmDocumentOpenError nRetVal = 0;
SwDmPreviewError nRetVal2 = 0;
Image image = default(Image);
//Access to interface
swClassFact = new SwDMClassFactory();
swDocMgr = (SwDMApplication)swClassFact.GetApplication("Post your code here");
swDoc = (SwDMDocument)swDocMgr.GetDocument(sDocFileName, nDocType, false, out nRetVal);
Debug.Assert(SwDmDocumentOpenError.swDmDocumentOpenErrorNone == nRetVal);
swCfgMgr = swDoc.ConfigurationManager;
pathLabel.Text = "Path to file: " + swDoc.FullName;
configLabel.Text = "Active config: " + swCfgMgr.GetActiveConfigurationName();
vCfgNameArr = (string[])swCfgMgr.GetConfigurationNames();
foreach (string vCfgName in vCfgNameArr)
{
//get preview
swCfg = (SwDMConfiguration7)swCfgMgr.GetConfigurationByName(vCfgName);
pPreview = (IPictureDisp)swCfg.GetPreviewPNGBitmap(out nRetVal2);
image = Support.IPictureDispToImage(pPreview);
//insert to picturebox
pictureBox1.BackgroundImage = image;
}
swDoc.CloseDoc();
}
这篇关于获取任何文件的缩略图,包括Windows XP/Vista上的SolidWorks的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!