Вызов Application.ProcessMessages, скорее всего, просто необходим, чтобы позволить времени управления ActiveX MSHTML завершить загрузку документа. Похоже, что они используют совместную многозадачность здесь для имитации загрузки документа в фоновом режиме - ActiveX отправляет сообщения самому себе для обработки следующего фрагмента или чего-то еще.
Обычно это не влияет на поток вашего приложения, потому что загрузка документа происходит как часть вашего обычного цикла обработки сообщений. Но поскольку вы хотите загружать документ синхронно (больше ничего не делать, пока документ полностью не загружен), вы чувствительны к тому, как он выполняет фоновую загрузку через сообщения.
Одно решение: посмотрите, можете ли вы удалить требование для синхронной загрузки документа. Пусть загрузка произойдет, когда это произойдет, но перенесите проверку на readState = complete в таймер, возможно, с интервалом в 1 секунду. Когда таймер обнаружит, что загрузка документа завершена, включите ваши действия вниз по цепочке питания.
Другое решение: отобразить модальное диалоговое окно в ожидании загрузки документа. Преимущество этого заключается в отключении остальной части вашего пользовательского интерфейса, поэтому вы не рискуете вернуться. Вызов ProcessMessages означает, что пользователь все еще может взаимодействовать с вашим окном, нажимать кнопки, меню и т. Д. Обычно это приводит к проблемам. Отображение модального диалога («Ход выполнения?») Позволяет избежать повторного входа, отключив все, что находится за модальным диалогом.
Третья возможность: замените Application.ProcessMessages на PeekMessage и логику, чтобы проверить сообщение, чтобы решить, пропустить его или вернуть обратно в очередь сообщений. Это немного грязно, но может работать в очень особых случаях.
Я рекомендую подход № 2, модальное диалоговое окно.