Dateivorschau per Interface IPreviewHandler

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

    Es gibt 11 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, 50 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-“ ()