我正在创建一个需要对IE中的滚动条事件做出反应的 IE 扩展(使用 VS2008、C++) 。我为此使用 BHO,并且可以访问父窗口的 IWebBrowser2 元素、IHTMLDocument2 元素和 HWND。我不知道如何访问滚动条。我已经看到允许我在访问滚动条后处理它们的代码,但不是如何获取滚动条对象(或者它们是 IE 窗口的子窗口?)本身。有任何想法吗?
问问题
745 次
2 回答
1
MSHTML 呈现它自己的滚动条,而不是使用本机系统控件。这就是您可以对它们应用 CSS 规则的原因。
我会尝试的是:
- QueryInterface() IHTMLElement 的 IHTMLDocument2 对象。
- QueryInterface() 用于 IConnectionPointContainer。
- 然后调用 IConnectionPointContainer::FindConnectionPoint(DIID_HTMLElementEvents2)。
- 实现 IDispatch::Invoke() 并且当有人滚动文档时你应该得到OnScroll事件。
- 冲洗并重复子帧。
于 2009-07-01T22:33:51.583 回答
0
因为我已经实现了 IDispatchImpl,我猜我必须重写 IDispatch::Invoke 方法的 ATL 实现来处理事件。这是对的吗?如果是这种情况,并且我有带有 DIID_DWebBrowserEvents2 的接收器条目,那会受到什么影响?这是我的班级的样子:
class ATL_NO_VTABLE CHelloWorldBHO :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
public IObjectWithSiteImpl<CHelloWorldBHO>,
public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>
{
.
.
.
BEGIN_SINK_MAP(CHelloWorldBHO)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)//Handle BeforeNavigate2
END_SINK_MAP()
.
.
.
}
谢谢
编辑:我发现当 Invoke 被覆盖时,永远不会调用 OnDOcumentCOmplete。我该如何解决这个问题?
于 2009-07-08T20:35:42.820 回答