Forum: PC-Programmierung axAcroPDF1 PDF Reader steuern


von Thomas S. (thomas_s72)


Lesenswert?

Hallo,
mit VS2017 und C# schreibe ich gerade ein Programm das ein PDF anzeit. 
Ich nutze dazu das COM Object das der Acrobat Reader mitbringt. Das 
klappt auch soweit ganz nett, ich scheitere aber an einem bestimmten 
Punkt.
In der Applikation brauche ich eine Methode, die im PDF rauf oder runter 
scrollt. Ich will also die UP und DOWN Tasten simulieren.
Leider kann ich nur die Funktionen für Seitenwechsel finden:

axAcroPDF1.gotoPreviousPage();
axAcroPDF1.gotoNextPage();

Die funktionieren auch schön, aber immer nur seitenweise.
Für das Scrollen simuliere ich momentan die Tasten UP und DOWN. Das ist 
ein etwas kranker Workaround und funktioniert nur wenn das PDF im Focus 
ist. Also manchmal eben nicht!!

Leider finde ich in dem Objekt keine Scrollfunktionen die den Job der 
UP/DOWW Tasten machen.
Wie kann ich das realisieren so dass der Focus aufs PDF nicht mehr 
notwendig ist?
Besten Dank,
Gruß
Thomas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Besorg Dir das Fensterhandle und schicke z.B. WM_VSCROLL an das Fenster:

https://docs.microsoft.com/en-us/windows/desktop/controls/wm-vscroll

von Thomas S. (thomas_s72)


Lesenswert?

Bin irgendwie zu dusselig das zu realisieren. Nach einigen Herumgoogeln 
habe ich die Funktion eingebunden ohne Fehler:

 public partial class Win10RB_Main : Form
    {
        [DllImport("User32.dll")]
        public static extern int SendMessage( IntPtr hWnd, int Msg, int 
wParam, int lParam);

        private const int WM_VSCROLL = 0x115;
        private const int WM_HSCROLL = 0x114;
        private const int SB_LINEDOWN = 1;
        private const int SB_LINEUP = 0;
        private const int SB_LINELEFT = 0;
        private const int SB_LINERIGHT = 1;
usw.....

Dann einen Button der das mal ausführt:

 private void button2_Click(object sender, EventArgs e)
        {
            SendMessage(axAcroPDF1.Handle, WM_VSCROLL, SB_LINEUP, 0);
            KmText.Text = axAcroPDF1.Handle.ToString();
        }

Im Text gebe ich mir den Handle aus auf das Adobe Objekt, es ist anders 
als das Form1, das habe ich verglichen und auch nicht Null.
Aber es scrollt nix. Weder rauf noch runter. Hat irgendwer ne Idee was 
mir noch fehlt?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Thomas S. schrieb:
> axAcroPDF1.Handle

Ist das ein Fensterhandle? Entspricht der Wert dem, den Du z.B. mit 
Spy++ zur Laufzeit herausfinden kannst?

von Thomas S. (thomas_s72)


Angehängte Dateien:

Lesenswert?

Tja, gute Frage. Es sollte der Handle zum PDF Fenster sein, nicht zum 
Form1 wo das drauf ist.
Mit Spy++ kann ich den auslesen wenn ich mit dem Fadenkreuz drauf bin.
Wenn ich dann aber OK klicke findet Spy++ das Ding dann nicht. Genau so 
mt dem Form1 Hauptfenster, ich kanndas anvisieren, wenn ich OK klicke 
gibt es das dann nicht. Komisch.
Ich hab mal ein Notepad++ Fenster so anvisiert, das ist OK.

Wieso findet der Spy++ mein Hauptfenster wenn ich es auswähle und dann 
ist es nicht in dre Liste der Prozesse zu finden?

Ich habe es auch mit dem Namen versucht den der Spy gefunden hat, geht 
auch nicht. Siehe Screenshots im Anhang.

Und die Werte sind verschieden... :-(

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Thomas S. schrieb:
> Siehe Screenshots im Anhang.

Ist *.rtf das Format der Wahl für Screenshots?

von Thomas S. (thomas_s72)


Angehängte Dateien:

Lesenswert?

So, bin etwas weiter.
Mein Button macht nun das:

  private void button2_Click(object sender, EventArgs e)
        {
            IntPtr Adb = WindowFromPoint(200, 200);
            SendMessage(Adb, WM_VSCROLL, SB_LINEUP, 0);
            KmText.Text = Adb.ToString();
        }

Wenn ich also den Handle des PDF in Pixeln ermittele stimmt die Zahl mit 
dem überein was der Spy++ dort findet.
Bsp: 1901560 = 0x1D03F8, passt also.

Die Message sollte nun im PDF Reader ankommen, es scrollt aber nicht. 
Pic nun im richtigen Format, war ein Versehen..

Warum scrollt es trotzdem nicht?

von Thomas S. (thomas_s72)


Lesenswert?

Also die SendMessage Methode mit den Pointern klappt nicht.
Ich hab da Beispiele gefunden wo man in ein anderes Notepad Fenster 
schreiben kann, klappt.
Aber mein PDF Control reagiert nicht, obwohl die Pointer passen.
Ich nutze nun folgendes:

axAcroPDF1.Focus();
SendKeys.SendWait("{UP}");

Das klappt, muss damit leben.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dein Screenshot verbirgt die interessanten Teile. Das PDF-Control 
besteht offensichtlich aus einer ganzen Latte von Fenstern, was man in 
der Baumhierarchie noch erahnen kann. Es ist gut möglich, daß das 
Scroll-Event an eines der untergeordneten Fenster gesendet werden muss.

Hat denn Adobe das ActiveX-Control in den letzten Jahren verbessert? Ich 
hab' vor etlichen Jahren mal versucht, es produktiv zu nutzen und den 
Versuch wegen Untauglichkeit beendet.

Thomas S. schrieb:
> Also die SendMessage Methode mit den Pointern klappt nicht.

Pointer? Das sind keine Pointer.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.