从IE扩展中检测WebPage中的滚动

时间:2009-07-01 22:18:55

标签: c++ visual-studio-2008 internet-explorer scrollbar

我正在创建一个IE扩展(使用VS2008,C ++),需要对IE中的滚动条事件做出反应。我正在使用BHO,我可以访问父窗口的IWebBrowser2元素,IHTMLDocument2元素和HWND。我无法弄清楚如何访问滚动条。我看过一些代码,一旦我访问它们就允许我处理滚动条,而不是如何获取滚动条对象(或者它们是IE窗口的子窗口?)本身。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

MSHTML呈现自己的滚动条而不是使用本机系统控件。这就是为什么你可以将CSS规则应用于它们。

我会尝试的是:

  1. QueryInterface()IHTMLDocument2 IHTMLElement的对象。
  2. QueryInterface()表示 的IConnectionPointContainer。
  3. 然后打电话 的IConnectionPointContainer :: FindConnectionPoint(DIID_HTMLElementEvents2)。
  4. 实施IDispatch :: Invoke()和 你应该得到OnScroll 当有人滚动时的事件 文档。
  5. 冲洗并重复子框架。

答案 1 :(得分: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。我该如何解决这个问题?

答案 2 :(得分:0)

请参阅this主题获取答案。我的问题和正确答案已经在这里得到了恰当的描述。