C++ BHO中从未提出过DOMContentLoaded(IE9)

C++ BHO中从未提出过DOMContentLoaded(IE9),c++,internet-explorer-9,bho,C++,Internet Explorer 9,Bho,我想听听Internet Explorer 9 BHO中的DOMContentLoaded事件。我已将事件附加到NavigateComplete2事件中的IHTMLDocument3,但未成功(附件正常,但事件不会触发) 我为onload做了类似的事情:我将事件“onload”附加到IHTMLWindow3。在这种情况下效果很好 我知道当NavigateComplete2触发时DOM并没有完全加载,因为当时我无法访问页面的主体 如何在BHO中捕获DOMContentLoaded?我不知道为什么D

我想听听Internet Explorer 9 BHO中的
DOMContentLoaded
事件。我已将事件附加到NavigateComplete2事件中的
IHTMLDocument3
,但未成功(附件正常,但事件不会触发)

我为onload做了类似的事情:我将事件“onload”附加到
IHTMLWindow3
。在这种情况下效果很好

我知道当NavigateComplete2触发时DOM并没有完全加载,因为当时我无法访问页面的主体


如何在BHO中捕获
DOMContentLoaded

我不知道为什么
DOMContentLoaded
没有触发。最合乎逻辑的解释是,当您处理
NavigateComplete2
时,它已经启动了,尽管在这种情况下无法访问整个DOM有点奇怪。处理程序中文档的
readyState
是什么

无论如何,更好的解决方案可能是为
OnReadyStateChange
注册一个接收器,如下所示:

class CDocumentSink :
  public IDispEventImpl<1, CDocumentSink, &DIID_HTMLDocumentEvents2, &LIBID_MSHTML, 4, 0>
{
public:
  BEGIN_SINK_MAP(CDocumentSink)
    SINK_ENTRY_EX(1, DIID_HTMLDocumentEvents2, DISPID_READYSTATECHANGE, OnReadyStateChange)
  END_SINK_MAP()

  STDMETHOD_(void, OnReadyStateChange)(IHTMLEventObj* ev);
};
类CDocumentSink: 公共IDispenTempl { 公众: 开始\u接收器\u映射(CDocumentSink) SINK_ENTRY_EX(1,DIID_htmldocumentevents 2,DISPID_READYSTATECHANGE,OnReadyStateChange) END_SINK_MAP() 标准方法(无效,OnReadyStateChange)(IHTMLEventObj*ev); }; 您可以将其实现为现有类的一部分,也可以创建一个单独的类(如上面的示例所示)。当
readyState
为4(完成)时,DOM应该在那里并且可用