PDF-Viewer

  • Hallo zusammen

    Obwohl ich mich selbst als erfahrenen (>6 Jahre) AutoIt-User einschätze, komme ich momentan mit einem Problem überhaupt nicht weiter. Es geht um folgendes:

    Ich möchte einen einfachen PDF-Viewer entwickeln, der alle PDF-Dateien in einem Verzeichnisses ermittelt und dann immer eine auf einmal seitenweise anzeigt. Über Kontrollbuttons soll man in einem Dokument blättern bzw. zum nächsten Dokument springen können. Das Tool soll von ca. 50 Usern verwendet werden und die verfügbare Umgebung ist vorgegeben (Foxit installieren o.ä. wäre daher keine gangbare Lösung):

    • Windows 7, 64-Bit
    • Acrobat Reader XI

    Meine erste Idee war, Acrobat Reader via COM "fernzusteuern" - das scheint jedoch leider nicht zu funktionieren, da der Reader meines Wissens keine COM-Schnittstelle anbietet.

    Also habe ich den schon an mehereren Stellen präsentierten ActiveX-Ansatz gewählt (womit ich bisher 0 Erfahrungen hatte...), was dann so aussieht:


    #AutoIt3Wrapper_UseX64=n ist nötig, da AcroPDF.PDF.1 von einem 64-Bit-Script scheinbar nicht erkannt wird. Alles funktioniert auf den ersten Blick perfekt - bis die angezeigte PDF-Datei teilweise verdeckt wird, indem man ein anderes Fenster über das ActiveX-Control bewegt oder das pdfGUI teilweise nach unten aus dem Bildschirm bewegt und wieder reinzieht. Dann werden Inhalte dieses Controls, die von dem anderen Fenster verdeckt bzw. ausserhalb des Bildschirms waren, nur unvollständig neu gezeichnet. Manchmal muss man das ein paarmal wiederholen, bevor das Problem auftaucht, aber es passiert immer.


    Was ich bisher versucht habe:

    • Über GUIRegisterMsg weitere Windows-Events abzufangen funktioniert zwar. Ich habe diverseste Events (z.B. WM_PAINT) in unterschiedlichen Kombinationen getestet. Allerdings weiss ich (a) nicht ob nicht einfach vielleicht auf Betriebssystemebene paar Events verloren gehen und das Windows-interne Refresh daher nicht mit dem Neuzeichnen nachkommt und (b) wie ich in AutoIt ein ActiveX-Ctrl bzw. ein AcroPDF-Objekt überhaupt refreshen soll. Irgendwo war vorgeschlagen worden, das Objekt und das Control zu zerstören und alles neu zu generieren. Das funktioniert zwar, flackert aber wie blöde.
    • Die auskommentierte WinSetOnTop-Zeile verhindert zwar, dass andere Fenster das guiPDF überdecken können. Allerdings kann ich immer noch Probleme haben, wenn ich guiPDF teilweise aus dem Bildschirm schiebe. Ausserdem wäre es schöner, wenn das fertige Tool nicht immer im Vordergrund stehen müsste.
    • Statt des AcroPDF-Objektes ein Explorer-Objekt einzubinden, funktioniert problemlos. Dann habe ich jedoch reihenweise zusätzliche Kontroll-Elemente von Acrobat (z.B. die Seitenansicht bzw. Lesezeichen oder die Toolbar), die ich gerne ausblenden würde, um ein schlankes Userinterface präsentieren zu können.

    Ich kann mir nicht vorstellen, dass dieses Problem noch niemand ausser mir gehabt hat, und bin daher auf Eure Kommentare gespannt.


    Vielen Dank,
    Frank

    • Offizieller Beitrag

    Das mit dem teilweisen "nicht refreshen" des Fensters konnte ich reproduzieren (Win7 64 Bit, AutoIt v3.3.14.0).
    Wenn ich aber ein paar kleine Änderungen in Deinem Script vornehme (Style: BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MAXIMIZEBOX, $WS_OVERLAPPEDWINDOW, $WS_CLIPSIBLINGS, $WS_CLIPCHILDREN) und WM_PAINT) dann scheint das nicht mehr aufzutreten, zumindest bei mir nicht mehr.

  • Hi,

    sowas ähnliches hatte ich mal gebaut, das Teil haste (kompiliert) in den PDF-Ordner kopiert, ausgeführt und konntest dir alle nach der Reihe anzeigen lassen und durchblättern. Eine Art "Quick-Finder":

    Spoiler anzeigen

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Hallo Oscar, hallo xOr

    Vielen Dank für die superschnellen Antworten. Insbesondere der Tipp mit dem WM_PAINT-Callback, der GUICtrlSetState aufruft, war meaga-hilfreich. Ich hatte das gar nie versucht, da in der AutoIt-Hilfe zu GUICtrlCreateObj steht:

    The GUI functions GUICtrlRead and GUICtrlSet have no effect on thiscontrol. The object can only be controlled using 'methods' or'properties' on the $ObjectVar.

    Ich hatte angenommen, diese Aussage bezöge sich auch auf GUICtrlSetState...

    Nochmals Danke,
    Frank