#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 подключен в асинхронном коде, но я не знаю, как это исправить. Кажется, он отлично работает в одном потоке.