对 Application.ProcessMessages 的调用很可能只需要让 MSHTML activeX 控件有时间完成加载文档。听起来他们在这里使用协作式多任务处理来模拟在后台加载文档 - ActiveX 向自己发布消息以处理下一个块或其他任何内容。
通常,这不会影响您的应用程序的流程,因为文档加载将作为正常消息循环的一部分发生。但是因为您希望同步加载文档(在文档完全加载之前不要执行任何其他操作),因此您对它通过消息进行后台加载的方式很敏感。
一种解决方案:看看您是否可以删除同步加载文档的要求。让负载在发生时发生,但将 readState = complete 的检查移到计时器中,可能以 1 秒为间隔。当计时器发现文档加载完成时,启动下游食物链活动。
另一种解决方案:在等待文档加载时显示模式对话框。这样做的好处是禁用了 UI 的其余部分,因此您不会冒重入的风险。调用 ProcessMessages 意味着用户仍然可以与您的窗口交互,单击按钮、菜单等。通常这会导致问题。显示模式对话框(“进度对话框?”)通过禁用模式对话框后面的所有内容来避免重入。
第三种可能性:将 Application.ProcessMessages 替换为 PeekMessage 和逻辑以检查消息以确定是让它通过还是将其放回消息队列以供以后使用。这有点脏,但在非常特殊的情况下可能会起作用。
我推荐方法#2,模态对话框。