Вопрос

AxAcroPDF проглатывает все события, связанные с клавишами, как только попадает в фокус внимания, включая сочетания клавиш, нажатия клавиш и т.д.Я добавил фильтр сообщений, и он также не получает никаких сообщений, связанных с ключом.Это COM-компонент, может ли это иметь отношение к делу?

Есть ли какой-нибудь способ поймать их до того, как элемент управления начнет их проглатывать?

Это было полезно?

Решение

Hans правильный, Acrobat Reader создает два процесса Acrod32 ребенка, которые у вас нет прямой доступ к вашему управляемому коду.

Я экспериментировал с этим, и у вас есть три жизнеспособных варианта:

  1. Вы можете создать Глобальная система крюка, а затем ищите и отфильтровывайте / ответ на сообщения WM_STFOCUS, отправленные в White Windows Acrod32. Вы можете выполнить некоторые из этого из C #, используя библиотеку обертки, таких как здесь: http://www.codeproject.com/kb/system/wilsonsystemglobalhooks.aspx.

    Вам также необходимо определить правильные процессы, поскольку может быть более одного экземпляра вашего приложения или других экземпляров Acrod32. Это самое детерминированное решение, но потому что ваше приложение теперь будет фильтровало сообщения, отправленные каждому одному окну, в которой вообще не рекомендуем этот подход, потому что тогда ваша программа может негативно повлиять на стабильность системы.

  2. Находить Альтернативное управление просмотром PDF. Отказ Смотрите этот ответ на несколько коммерческих компонентов: .net PDF Viewer Control или сверните свой собственный: http://www.codeProject.com/kb/applations/pdfviewercontrol.aspx.

  3. Находить приемлемый взлом. Отказ В зависимости от того, насколько надежно ваше приложение должно быть, код, такой как следующее может быть подходит (он был подходит для моего случая):

    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();
    }
    

Другие советы

Возможно, у меня может быть смешно простой ответ. До сих пор в тестировании это работает.

Страдав от этой проблемы в течение довольно некоторого времени и построив сложную систему каждого пользовательского контроля, которую из них в последний раз имел фокус и использование таймера, чтобы вернуть фокус (когда acroppdf схватил его), я пересмотрел эту проблему и прочитал большое количество Ответы (ищет недавние решения). Информация Gleanted помогла мне с идеей.

Идея состоит в том, чтобы отключить контроль (ACROPDF), в то время как он загружается, как в следующем примере (код уменьшен для ясности)

AXACROPDF_THIS.ENALD = FALSE AXACROPDF_THIS.SRC = M_SRC

Затем на таймере, скажем, 1 секунду.

Axacropdf_this.enabled = false.

В основном идея состоит в том, чтобы сообщить Windows не позволять пользователям использовать элемент управления ACROPDF, пока не допускается, поэтому просим Windows предотвратить его получить фокус (потому что пользователи не допускаются там).

Пока что это держит, я редактирую это, если что-то изменится. Если оно не работает для вас, то, возможно, идея указывает на полезное направление.

Это нерабочий COM-компонент, вот в чем проблема.Полностью нарушает требования Windows SDK, изложенные в SetParent().Как только его окно попадает в фокус, цикл сообщений в процессе acroread.exe получает все сообщения, ваш фильтр сообщений больше не может видеть никаких сообщений.

Технически это можно исправить, используя SetWindowsHookEx() для внедрения библиотеки DLL в процесс и отслеживания сообщений с помощью WH_GETMESSAGE.Но вы не можете написать такую библиотеку DLL на языке C #.

Большой отстой, я знаю.Кажется, в этой программе никогда не бывает недостатка в этом.

По какой-то причине ответа Тим, отключая контроль AXACROPDF напрямую, не работал в моем случае. Событие отпуска на ранее выбранном текстовом поле никогда не выстрелил.

То, что работает, вложил в гвоздику управления AXACROPDF внутри группового ящика отключенного отключения. Поскольку пользователи моего приложения необходимо увидеть только PDF, не взаимодействовать с ним, свойство включенного Groupbox установлено значение false в дизайнере.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top