2012-08-09 11 views
7

Ci sono molti ThumbnailProvider incorporati in ogni sistema operativo installato. A causa di questi provider, Windows è in grado di mostrare una miniatura di molti file. Ad esempio, Windows Explorer può mostrare il contenuto dei file * .jpg, ma anche dei file Solidworks * .sldprt (se è installato SolidWorks).Ottieni una miniatura di qualsiasi file, tra cui SolidWorks su Windows XP/Vista

Ma c'è un modo per ottenere queste miniature? Ive ha provato a gestire questo utilizzando Windows API CodecPack, ma riuscì solo su Windows 7.

ShellFile shellFile = ShellFile.FromFilePath(filePath);     
Bitmap shellThumb = shellFile.Thumbnail.Bitmap; 

domanda è: c'è qualche altro modo utilizzabile per ottenere Miniatura di qualsiasi file con il fornitore Thumbnail registrato su Windows XP/Vista? Io davvero disperata ...

risposta

-1

È possibile utilizzare metodi non gestiti finestre della shell per ottenere la miniatura

Here is the code (not a small one)

Ma i risultati sono ben lungi dall'essere perfetto.

  • debug è molto difficile, errore non specificato sono comuni
  • ci deve essere lettore di file specifici availible sul computer di destinazione (ad esempio, pdf-reader per i PDF, non ha provato sulla SolidWorks)
  • può funzionare solo in Windows
  • problema di prestazioni
  • qualità
  • miniature bassa (provato con pdf)
5

ci sono diversi modi:

1) Con libreria OpenMCDF. Il file di Solidworks è Compound document quindi l'accesso al suo contenuto - sta analizzando il 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) Con la libreria EModelView.dll da aggiungere come controllo e posizionata nel modulo.

OpenFileDialog dialog = new OpenFileDialog(); 
     if (dialog.ShowDialog() == DialogResult.OK) 
     { 
      axEModelViewControl1.OpenDoc(dialog.FileName.ToString(), false, false, true, ""); 
     } 

3) Con biblioteca SWExplorer (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) Con la libreria 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(); 
     } 
+0

L'esempio openMCDF non funziona. C'è un elemento "Anteprima" ma .net mi dice che non è un'immagine ??? – jimconstable

+0

Ho indicato l'esempio di SolidWorks, quindi dovrebbe funzionare. Se si ottiene un'immagine per il file SolidWorks, il nome del membro deve essere "PreviewPNG", non "Anteprima". – streamdown

+0

Provato openMCDF, non ha funzionato. Quindi ho provato swdocumentmgr. Dopo aver avuto difficoltà a trovare le DLL stdole e microsoft.visualbasic.compatibility, non ha funzionato altrettanto bene. Non funziona su "GetPreviewPNGBitmap" dicendo che la classe non ha una licenza d'uso. – AXMIM

Problemi correlati