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
Besorg Dir das Fensterhandle und schicke z.B. WM_VSCROLL an das Fenster: https://docs.microsoft.com/en-us/windows/desktop/controls/wm-vscroll
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?
Thomas S. schrieb: > axAcroPDF1.Handle Ist das ein Fensterhandle? Entspricht der Wert dem, den Du z.B. mit Spy++ zur Laufzeit herausfinden kannst?
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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.