SHDocVw InternetExplorer.DocumentComplete не работает каждый раз

#c# #internet-explorer #shdocvw

#c# #internet-explorer #shdocvw

Вопрос:

Я использую SHDocVw для запуска нового экземпляра InternetExplorer и ввода некоторого кода на каждую страницу, на которую переходит пользователь:

 var internetExplorer = new InternetExplorer
{
    Visible = true
};
RegisterEvents(internetExplorer);
internetExplorer.Navigate2(url);
  

RegisterEvents:

 private static void RegisterEvents(InternetExplorer internetExplorer)
{
     internetExplorer.NavigateComplete2  = new DWebBrowserEvents2_NavigateComplete2EventHandler(InternetExplorer_NavigateComplete2);
}
  

Проблема в том, что он запускается не каждый раз. Иногда это работает, иногда нет.
Этот код выполняется асинхронным методом.
Теперь лучшая часть. Я пробовал что-то вроде этого:

 private static void RegisterEvents(InternetExplorer internetExplorer)
        {
            Thread t = new Thread(() =>
            {
                internetExplorer.DocumentComplete  = InternetExplorer_DocumentComplete;
                while (true)
                {
                }
            });

            t.Start();
            Debug.WriteLine("RegisterEvents");
        }
  

Каким-то образом это работает каждый раз! Но мне не нравится этот бесконечный цикл.
Что может быть не так с моим первым подходом? Почему работает второй и как я могу сделать это лучше?

Комментарии:

1. Возможно, вы захотите рассмотреть возможность использования WebView2 , поскольку поддержка Internet Explorer становится все сложнее и сложнее…

2. Пользователь может открыть новый экземпляр IE из моего приложения, и мне нужно обнаружить все открытые экземпляры и добавить это событие. Поэтому я должен использовать SHDocVw.

3. NavigateComplete возвращается до завершения всех сценариев и кода Java. Поэтому я обычно проверяю, чтобы убедиться, что объект не равен нулю, прежде чем использовать объект. В VBA я обычно помещаю DoEvent внутри цикла while и жду IE.readyState != 4

4. Я протестировал приведенный выше пример кода в браузере IE 11, и он отлично работает на моей стороне. Смотрите здесь Вы каждый раз тестируете одну и ту же страницу? Можете ли вы вручную проверить, полностью ли загружена страница, когда она не запускает событие? Это может помочь сузить проблему.

5. Я думаю, что проблема в том, что обработчик события add подключен в асинхронном коде, но я не знаю, как это исправить. Кажется, он отлично работает в одном потоке.