2012-08-09 13 views
7

In jedem installierten Betriebssystem gibt es viele eingebaute ThumbnailProvider. Aufgrund dieser Anbieter kann Windows Thumbnail vieler Dateien anzeigen. Zum Beispiel kann der Windows Explorer den Inhalt von * .jpg-Dateien anzeigen, aber auch von Solidworks * .sldprt-Dateien (wenn SolidWorks installiert ist).Miniaturansicht aller Dateien einschließlich SolidWorks unter Windows XP/Vista

Aber gibt es eine Möglichkeit, diese Thumbnails zu bekommen? Ive versuchte, dies mit dem Windows-API-Codecpack zu verwalten, aber ich konnte nur unter Windows 7.

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

Frage ist: Gibt es eine andere Art und Weise verwendbar Thumbnail einer Datei mit registrierten Thumbnail-Provider auf Windows XP zu erhalten/Vista? Ich bin wirklich verzweifelt ...

Antwort

-1

Sie können nicht verwaltete Windows-Shell-Methoden verwenden, um die Miniatur

Here is the code (not a small one)

aber die Ergebnisse sind nicht perfekt weit zu kommen.

  • Debugging ist sehr hart, sind nicht näher beschriebener Fehler gemeinsamen
  • es hat spezifische Dateileser availible auf Zielrechner (zB pdf-Reader für PDF-Dateien, nicht auf Solidworks versucht hat)
  • arbeiten können nur in Windows
  • Leistungsproblem
  • Thumbnails minderer Qualität (versuchte es mit pdf)
5

es gibt mehrere Möglichkeiten:

1) Mit Bibliothek OpenMCDF. Solidworks-Datei ist Compound document so Zugriff auf den Inhalt - analysiert die Datei.

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) Mit Bibliothek EModelView.dll als Steuerelement hinzugefügt und in das Formular platziert werden.

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

3) Mit SWExplorer Bibliothek (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) Mit Bibliothek 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

Das openMCDF Beispiel funktioniert nicht. Es gibt ein "Vorschau" -Element, aber .net sagt mir, dass es kein Bild ist ??? – jimconstable

+0

Ich wies auf das Beispiel Solidworks hin, sollte also funktionieren. Wenn Sie ein Bild für Solidworks-Datei erhalten, muss der Mitgliedsname "PreviewPNG" sein, nicht "Preview". – streamdown

+0

Versuchte openMCDF, hat nicht funktioniert. Dann versuchte swdocumentmgr. Nachdem es schwierig war, stdole und microsoft.visualbasic.compatibility dlls zu finden, funktionierte es nicht so gut. Es schlägt auf "GetPreviewPNGBitmap" fehl, dass die Klasse keine Nutzungslizenz hat. – AXMIM

Verwandte Themen