Frage

Die AxAcroPDF schluckt alle Schlüsselbezogene Ereignisse, sobald es Fokus erhält, einschließlich Verknüpfungen, Drücken von Tasten, ich einen Nachrichtenfilter hinzugefügt, und es keine Schlüssel bezogene Nachrichten entweder bekommen. Es ist eine COM-Komponente, könnte das relevant sein?

Gibt es eine Möglichkeit diese, bevor die Steuerung beginnt beim Schlucken, sie zu fangen?

War es hilfreich?

Lösung

Hans korrekt ist, die der Acrobat Reader Spawns zwei Kind Acrord32 Prozesse, die Sie keinen direkten Zugriff haben aus Ihrem verwalteten Code.

Ich habe mit diesen experimentiert und Sie haben drei mögliche Optionen:

  1. Sie können ein globales System Haken erstellen , und suchen Sie dann nach und auszufiltern / reagieren auf WM_SETFOCUS Nachrichten an Ihr Kind Acrord32 Fenster gesendet. Sie können hier durch die Verwendung einer Wrapper-Bibliothek, wie das einige dieser aus C # erreichen: http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx

    Sie müssen auch die richtigen Prozesse zu identifizieren, da es sein kann mehr als eine Instanz Ihrer Anwendung oder anderer Instanzen von Acrord32. Dies ist die deterministische Lösung, sondern weil Ihre Anwendung jetzt Nachrichten an jedes einzelne Fenster in Existenz gesendet Filterung wird, ich diesen Ansatz im Allgemeinen nicht empfehlen, weil dann Ihr Programm negativ auf die Systemstabilität beeinträchtigen könnten.

  2. Finden Sie eine alternative PDF-Anzeige-Steuerung . Sehen Sie diese Antwort für einige kommerzielle Komponenten: .net PDF-Viewer-Steuerelement , oder rollen Sie Ihre eigenen: http://www.codeproject.com/KB/applications/PDFViewerControl.aspx

  3. Finden Sie eine akzeptabel Hack . Je nachdem, wie robust Ihre Anwendung sein, Code wie die folgenden geeignet sein kann (es war geeignet für meinen Fall):

    DateTime _lastRenav = DateTime.MinValue;
    
    public Form1()
    {
        InitializeComponent();
    
        listBox1.LostFocus += new EventHandler(listBox1_LostFocus);
    }
    
    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        axAcroPDF1.src = "sample.pdf";  //this will cause adobe to take away the focus
        _lastRenav = DateTime.Now;
    }
    
    void listBox1_LostFocus(object sender, EventArgs e)
    {
        //restores focus if it were the result of a listbox navigation
        if ((DateTime.Now - _lastRenav).TotalSeconds < 1)
            listBox1.Focus();
    }
    

Andere Tipps

Ich könnte endlich eine lächerlich einfache Antwort hat. Bisher dies bei der Prüfung funktioniert.

Nachdem dieses Problem schon seit geraumer Zeit gelitten und ein komplexes System von jeder benutzerdefinierten Steueraufzeichnung gebaut zu haben, die von ihnen zuletzt hatte Fokus und mit Hilfe eines Timers zu Flip Fokus zurück (wenn acropdf es packt) ich dieses Problem revisited und lese eine große Anzahl von Antworten (der Suche nach dem letzten Lösungen). Die Informationen nachgelesen mich mit der Idee geholfen.

Die Idee ist, die (AcroPDF) -Steuerung zu deaktivieren, während sie Laden, wie in dem folgenden Beispiel (Code reduziert zur Klarheit) ist

AxAcroPDF_this.Enabled = False AxAcroPDF_this.src = m_src

Dann auf einem Timer, nach etwa 1 Sekunde.

AxAcroPDF_this.Enabled = False

Im Grunde ist die Idee von Windows zu sagen, dass Benutzer die acropdf Steuerung verwenden zu lassen, bis erlaubt, damit Windows zu fragen, um zu verhindern Fokus bekommen (weil die Benutzer dort nicht erlaubt sind).

Bisher in dieser hält, werde ich diese Änderungen, wenn etwas bearbeiten. Wenn es nicht ganz für Sie arbeiten dann vielleicht die Idee Punkte in eine nützliche Richtung.

Es ist eine Out-of-Process-COM-Komponente, das ist das Problem. Vollständig in Verletzung der Anforderungen Windows SDK Bestimmungen im SetParent (). Sobald das Fenster den Fokus erhält, wird die Nachrichtenschleife im acroread.exe Prozess alle Nachrichten, Ihre Nachrichtenfilter nicht mehr alle Nachrichten sehen können.

Technisch ist es fixierbar mit SetWindowsHookEx () eine DLL in den Prozess und Monitor-Nachrichten mit WH_GETMESSAGE zu injizieren. Aber man kann nicht schreiben, eine solche DLL in der Sprache C #.

Wichtige saugen, ich weiß. Es scheint nie mit diesem Programm jeder Mangel davon zu sein.

Für einige Antwort des Grundes Tim, das Deaktivieren der AxAcroPDF Kontrolle direkt, hat nicht funktioniert in meinem Fall. Das Leave-Ereignis auf der zuvor ausgewählte Textbox würde niemals Feuer, auch nicht.

Was funktioniert nistet die AxAcroPDF Kontrolle innerhalb eines behinderten GroupBox. Da die Benutzer meiner Anwendung müssen nur das PDF sehen, die nicht mit ihm interagieren, die Enabled der GroupBox Eigenschaft wird im Designer auf False festgelegt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top