Dateivorschau per Interface IPreviewHandler

    • VB.NET
    • .NET (FX) 4.5–4.8

    Es gibt 55 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

      Dateivorschau per Interface IPreviewHandler

      Hi@all

      Eigentlich kennt das ja jeder. Die Vorschau bei einem OpenFileDialog oder im Explorer. Doch wie kann man dieses im eigenen Programm nutzen? Windows stellt dafür das Interface IPreviewHandler zur Verfügung. Dieses Beispiel zeigt wie es funktioniert. Das schöne an diesem Interface ist, das es unabhängig von den installierten Programmen arbeiten kann. Bedeutet, sofern für eine bestimmte Datei ein PreviewHandler in der Registry vorhanden ist, wird dieser verwendet um eine Vorschau anzuzeigen. z.B. falls der ArcobatReader für PDF installiert ist, wird der PreviewHandler vom AcrobatReader verwendet. Falls z.B. der FoxitReader für PDF installiert ist, wird der PreviewHandler vom FoxitReader verwendet. Falls kein entsprechendes Programm für z.B. PDF installiert ist, wird der vorhandene Standard PreviewHandler verwendet. In den meisten Fällen wäre das für PDF der EdgeBrowser. Kurz gesagt, es wird das genutzt, was auf dem System vorhanden ist. Es muss daher keine Zusätzliche Software installiert werden. Einige Dateien besitzen teilweise mehrere PreviewHandler weswegen das Programm versucht diese in einer bestimmten Reihenfolge abzufragen um das bestmögliche herauszuholen. Die PreviewHandler sind alle in der Registry unter "HKEY_CLASSES_ROOT\.[FileExt]\ShellEx" zufinden. Das Interface IPreviewHandler kann daher eine vielzahl an Dateien für eine Vorschau laden und anzeigen. Als Alternative, falls kein PreviewHandler für eine Datei vorhanden ist bzw. IPreviewHandler komplett fehlschlägt, wird halt versucht zumindest das Icon oder ein Bild von der Datei anzuzeigen (ist so im Explorer nicht vorgesehen und daher Optional).

      Im Internet gibt es diverse Beiträge wo immer wieder von Problemen mit diesem Interface und dem AcrobatReader berichtet wird. Ich habe das nun auf 3 verschiedenen Rechnern ausprobiert und hatte keine Probleme im Zusammenhang mit dem AcrobatReader. Falls jemand eine Lösung für das Problem im Zusammenhang mit diesem Interface kennt, immer her damit. :) Windows kann das ja offensichtlich ohne Probleme. What ever. Einfach mal diesen Code mit unterschiedlichen Dateien (PDF, Office Dokumente, Bilder, Audio, Video usw) ausprobieren. Je nach Dateityp kann es auch schon mal ein paar Sekunden dauern bis die Vorschau was anzeigt (oder die Rückgabe checken ob True oder False). Ansonsten: Das ist Testcode, keine extra Verweise oder Fremdpakete.

      Ach ja, der Screenshot zeigt eine PDF die über den PreviewHandler vom AcrobatReader geladen und angezeigt wird.
      Bilder
      • IPreviewHandler_PDF.png

        62,91 kB, 733×605, 367 mal angesehen
      Dateien
      Mfg -Franky-

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „-Franky-“ ()

      Sicher, dass das nur ein Preview ist? Mir werden bei mehrseitigen PDFs alle Seiten angezeigt - scrollbar. Geile Sache. Erspart mir einen externen PDF-Viewer in meine Programme einzubauen. Auch wenn der Code dafür immer noch schwer begreiflich ist. Zuviel API-Code für mein VB.NET-verseuchtes Hirn =O
      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

      Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
      Hi

      Na ja. Im Explorer heißt das Fenster rechts Vorschau und das Interface dazu IPreviewHandler. Also ja, ist eine Preview. ;) , wahrscheinlich auch weil die Preview nur einen eingeschränkten Funktionsumfang besitzt. Mir ist gestern, so beim sinieren über den Ablauf des Codes, wahrscheinlich noch ein "ID 10 T"-Fehler aufgefallen. Das werde ich die Tage noch ein klein wenig abändern.

      Ach komm schon. So viele APIs sind es doch gar nicht. Ich hab sogar noch ein optionales Interface weggelassen. ;) Dafür das damit diverse Dateien angezeigt werden können, ist das doch noch recht übersichtlich und kleiner Code.
      Mfg -Franky-

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „-Franky-“ ()

      Hi@all

      Ich hab mal die Logik, welcher PreviewHandler wann geladen werden soll, ein wenig geändert. Im groben ist es aber so geblieben wie es ist. Also wer sich das Bsp. bereits heruntergeladen hatte, im Ausgangspost hab ich den Download erneuert.

      Es wäre evtl. für andere hilfreich, wenn Ihr den Code testet und einen Kommentar da lasst, ob bei Euch die Anzeige einer PDF problemlos funktioniert. Speziell dann, falls ihr den AcrobatReader nutzt. Von mir aus auch falls ihr einen anderen PDF Betrachter nutzt und was ihr da nutzt. Alle anderen Dateien sollten so funktionieren wie im Explorer auch. Ist aber kein Muss. Thx
      Mfg -Franky-

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „-Franky-“ ()

      Moin.

      PowerToys von MS ist ja Open Source und die haben das PreviewHandling erweitert.
      Wie die das gelöst haben, könnte vielleicht hilfreich sein.

      github.com/microsoft/PowerToys…n/src/modules/previewpane

      c.u. Joshi
      @-Franky- Ich hab ein wenig rumgespielt (W10).
      Ein mehrseitiges PDF wird problemlos scrollbar angezeigt.
      Zum Vergrößern und Verkleinern glaube ich, dass Icons in der maximal vorhandenen Größe angezeigt werden.
      Bei älteren Dateien ist das 32x32 Pixel, das wird nicht gezoomt.
      Große Icons (2556x256) werden gezoomt.
      Wenn die Vorschau in ihrer Größe geändert wird (Resize), kommt es reproduzierbar zu einer AccessViolationException.
      ====
      CS-Dateien zeigt er als Quelltext an, VB-Dateien als Icon.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

      @Joshi Uii, ok. Das schau ich mir auf jeden Fall an. Mal schauen was da anders ist. Wobei ich letztens mal was im Zusammenhang mit dem Preview von den Powertoys und PDF gelesen hatte das es da Probleme gab. Vllt ist das ja auch schon behoben worden.

      @RodFromGermany Das mit den Icons ist ja der zusätzlicher Code, den der Explorer nicht verwendet und ist der optionale Code am Ende per IShellItemImageFactory. Der Explorer zeigt da einfach nur "keine Vorschau möglich". Ja das mit den älteren Programmen, die nur Icons in max. 32x32 Pixel enthalten, wird das Icon nur in 32x32 Pixel geladen und ein entsprechender großer Rahmen um das Icon gezeichnet. Klar könnte man auch dieses 32x32 Icon nachträglich zoomen, schaut dann aber eher nicht so schön aus. Das Verhalten mit den CS/VB-Dateien ist auch so im Explorer in der Vorschau zu sehen. Dann gibt es für CS Dateien einen PreviewHandler, für VB Dateien keinen. Das mit der AccessViolationException kann ich nicht nachvollziehen. Läuft bei mir ohne Probleme. Der optionale Code per IShellItemImageFactory kann auch raus. Dann verhält sich das ganze wie der Explorer und zeigt keine Icons in der Vorschau an.

      Ich hatte doch schon mal in irgendeinem Thread das gleiche Ding, als Control das man sich auf die Form ziehen kann, gepostet. Da hab ich das mit den Zoom von Bildern/Preview auch anders gelöst. Da zoome ich das Bild und lade es nicht erneut. Ich erzeuge da allerdings noch die Interfaces per Activator.CreateInstance was aber offensichtlich zu Problemen führt wegen den Flags CLSCTX_LOCAL_SERVER / CLSCTX_INPROC_SERVER. Daher erzeuge ich hier das ganze per API CoCreateInstance weil ich hier genau steuern kann wie bzw als was das Interface erzeugt werden soll bzw. wird erst versucht das Interface per CLSCTX_LOCAL_SERVER zu laden und als Fallback wenn das fehlschlägt, per CLSCTX_INPROC_SERVER. Das könnte man auch so dann im Code aus dem anderem Thread einbauen.

      Wie auch immer, das hier ist Testcode und kein fertiges, vollständiges oder auch fehlerfreies Beispiel. Es soll ja nur zeigen wie es funktioniert. Alles andere überlasse ich Euch das so umzuprogrammieren, wie Ihr es benötigt.
      Mfg -Franky-

      RodFromGermany schrieb:

      CS-Dateien zeigt er als Quelltext an, VB-Dateien als Icon.

      It's not a bug, it's a feature.
      Da muss man manuell nachbessern. timothytocci.com/2017/06/23/pr…windows-10-8-7-and-vista/

      Quellcode

      1. Windows Registry Editor Version 5.00
      2. [HKEY_CLASSES_ROOT\.vb]
      3. "Content Type"="text/plain"
      4. "PerceivedType"="text"
      5. [HKEY_CLASSES_ROOT\.vb\shellex]
      6. [HKEY_CLASSES_ROOT\.vb\shellex\{8895b1c6-b41f-4c1c-a562-0d564250836f}]
      7. @="{1531d583-8375-4d3f-b5fb-d23bbd169f22}"
      @'-Franky-' Die Exception kommt, wenn Du das Fenster kleiner ziehst, als die Vorschau groß ist.
      Allerdings habe ich das Fenster per Ancor an allen 4 Seiten angepint.
      @HenryV OK, das werde ich nicht nach-implementieren. ;)
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ ()

      RodFromGermany schrieb:

      Allerdings habe ich das Fenster per Ancor an allen 4 Seiten angepint.
      Ahh, ok. In meinem Code aus dem anderen Thread, hatte ich verhindert das das Fenster (evtl auch die Preview-Picturebox) eine bestimmte Größe unterschreitet.

      Edit: Der alte Code ist hier zu finden. Adobe PDF in WebBrowser darstellen Hier müsste man entsprechend Activator.CreateInstance durch die API CoCreateInstance ersetzen und die Logik wann welcher Handler geladen werden soll ändern. Ist sicher auch noch nicht fehlerfrei, aber etwas weiter Ausgebaut als dieser Testcode. Na ein bissel was muss ja für Euch auch noch übrig bleiben. ;)
      Mfg -Franky-

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()

      @-Franky- Das habe ich inzwischen auch getan.
      Ich habe zwei Sorten PDFs identifiziert, bei der einen wird nur die erste Seite angezeigt,
      bei der anderen kann man durch das ganze Dokument scrollen.
      Vermutung: Office - Save As PDF macht ggf. nur eine Seite, das muss ich mal zu Hause in Ruhe untersuchen.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      @Joshi Ich hab mir mal die PDF Geschichte von den Powertoys angeschaut. So wie ich das ganze sehe, ersetzt Powertoys, wenn man das möchte, den eingetragenen PDF-PreviewHandler durch seinen eigenen PreviewHandler. Finde ich jetzt nicht so prickelnd. Ansonsten nutzt Powertoys den Namespace Windows.Data.Pdf um die PDF zu rendern. Was da drin steckt müsste man sich anschauen.

      Edit: Also es gibt da wohl eine Windows.Data.pfd.dll im System32 Ordner. Diese DLL exportiert eine Funktion PdfCreateRenderer. Wenn man entsprechend weiter danach sucht, kommt man drauf das man hier DirectX benötigt um die Seiten zu rendern.
      Mfg -Franky-

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „-Franky-“ ()

      Hallo, und danke für den Code @-Franky-, genau danach habe ich gesucht! Ich habe Ihn getestet und er Funktioniert wunderbar, bei PDF' Word, etc.! Zusätzlich habe ich in bei *.SLDDRW, .SLDPRT, SLDASM sowie *.SZA (das sind CAD Datei Formate) getestet und er funktioniert. Er extrahiert aus den Dateien die Bitmaps bzw. Images und zeigt Sie in der Picturebox an. Ich werde den Code jetzt für meinen bedarf anpassen! Super Top Arbeit und der Code ist auch echt gut leserlich!!!
      @GOKTerek Es freut mich wenn Dir mein Bsp. weiter hilft. Sofern der Explorer das in der Vorschau anzeigen kann, kann mein Code das auch. Beide verwenden die gleichen COM-Interfaces. Anpassen solltest meinen Code auf jeden Fall. Das hier ist ja nur ein Bsp wie es grundsätzlich funktioniert.
      Mfg -Franky-
      Hallo @-Franky-,

      ich habe ein kleines Problem mit deinem Previewhandler. Ich konnte Ihn zu 40% bei mir in mein WPF Projekt einbinden, siehe Bild_001.

      Jetzt habe ich aber das Problem, das er bei mir komplett in dieser Codezeile stoppt, wenn ich die große Vorschau anzeige! Das Programm stürzt nicht ab, es kommt kein Fehler, nichts! Das Programm ist einfach Froozen!

      VB.NET-Quellcode

      1. Private Function CreateInterface(CLSID As String, IID As String) As IntPtr
      2. Dim pInterface As IntPtr = IntPtr.Zero
      3. If CoCreateInstance(New Guid(CLSID), IntPtr.Zero, CLSCTX_LOCAL_SERVER, New Guid(IID), pInterface) = S_OK Then ' [b]hier stoppt das Programm[/b]
      4. Return pInterface
      5. ElseIf CoCreateInstance(New Guid(CLSID), IntPtr.Zero, CLSCTX_INPROC_SERVER, New Guid(IID), pInterface) = S_OK Then
      6. Return pInterface
      7. End If
      8. End Function


      Das Problem ist bis jetzt nur aufgetreten wenn ich Excel Dateien in der Vorschau anzeigen möchte! Die Excel Vorschau funktioniert auch nur Teilweise im Explorer.
      Also ein und die selbe Excel Datei wird mal angezeigt und mal nicht. Das selbe Problem, ist dann aber auch in dem PreviewHandler. Gibt es eine möglichkeit den Fehler abzufangen damit das Programm nicht Freezed?

      Kurz zur Info:
      Bei PDF'S habe ich das Problem nicht, hier funktioniert es einwandfrei. Word Dokumente habe ich noch nicht getestet!
      Bilder
      • PreeviewHandler_001.PNG

        178,29 kB, 2.124×772, 291 mal angesehen
      Hi

      Ich bin derzeit im Urlaub. Was ich aber sagen kann ist, wenn es schon im Explorer Probleme gibt, dann hat mein Code das gleiche Problem. Mein Code macht nichts anderes wie der Explorer auch um die Preview anzuzeigen. Von daher müsste man erstmal herausfinden warum die Preview im Explorer mal geht und mal nicht.
      Mfg -Franky-
      Ich kann das bestätigen.
      *.xls; *.xlsx sowohl bei x86 als auch bei x64 bleibt in besagter Zeile hängen.
      Win10, Studio 2019.
      Als Arbeitsdrumherum könnte man diese Extensionen abfangen und ein vorgefertigtes Icon anzeigen.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      @-Franky- erstmal schön das du dich gemeldet hast, ich wünsch dir / euch einen schönen Urlaub :-)!

      @RodFromGermany danke das du das bestätigst. Also einfach die besagten Dateitypen, nicht als Vorschau anzeigen!?
      Hmm, nicht schön aber eine Lösung, In 90% der Fälle möchte man sowieso nur *.PDF's sehen.

      Hier noch mal evtl. als Gedanken Ansatz, ich habe einen anderen IPreviewHandler von GITHub runtergeladen, der hat das selbe Problem.
      https://github.com/GeeLaw/PreviewHost

      Nur zur Info @-Franky- deiner ist besser, der hat auch die Icon funktion ;-)!

      GOKTerek schrieb:

      Hmm, nicht schön aber eine Lösung,
      Ich habe das in meinen Dublettenfinder eingebaut, das funktioniert wunderbar.
      Der Explorer zeigt da gar nix an.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!
      Hi

      Die Icon-Funktion hab ich als Zusätzliches Feature eingebaut. Der Explorer zeigt da einfach nur an, dass er da keine Vorschau erstellen kann. Wie auch immer, bei meinem letztem Test war das erstellen der Preview von Exceldateien kein Problem. Wie geschrieben, wenn der Explorer hier schon ein Problem hat eine Preview zu erstellen, dann haben alle Codes, die den IPreviewHandler nutzen das gleiche Problem. Evtl. ist durch ein Windows/Office-Update mal wieder was kaputt gepatcht worden. Wäre ja nicht das erste mal. Gelegentlich gibt es vom System, wenn der Preview nicht funktioniert, eine Fehlermeldung das im Temp-Ordner irgendwas nicht erstellt werden kann bzw. es fehlen bestimmte Ordner oder bestimmte Reg-Einträge müssen gelöscht werden. Dazu solltest Du einiges an Infos im Internet finden wie man die Preview von Officedateien repariert.
      Mfg -Franky-