【问题标题】:Detect scrolling in WebPage from IE extension [duplicate]从 IE 扩展检测网页中的滚动 [重复]
【发布时间】:2010-11-07 11:36:32
【问题描述】:

我正在创建一个 IE 扩展(使用 VS2008、C++),它需要对 IE 中的滚动条事件做出反应。我为此使用 BHO,并且可以访问父窗口的 IWebBrowser2 元素、IHTMLDocument2 元素和 HWND。我不知道如何访问滚动条。我已经看到了允许我在可以访问它们后处理滚动条的代码,但不是如何获取滚动条对象(或者它们是 IE 窗口的子窗口?)本身。有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    既然我已经实现了 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】:

      MSHTML 呈现它自己的滚动条,而不是使用本机系统控件。这就是您可以对它们应用 CSS 规则的原因。

      我会尝试的是:

      1. QueryInterface() IHTMLDocument2 IHTMLElement 的对象。
      2. QueryInterface() 用于 IConnectionPointContainer。
      3. 然后调用 IConnectionPointContainer::FindConnectionPoint(DIID_HTMLElementEvents2)。
      4. 实现 IDispatch::Invoke() 和 你应该得到OnScroll 当有人滚动 文件。
      5. 冲洗并重复子帧。

      【讨论】:

      • 感谢您的回答。由于我使用 ATL,我意识到我可以在我的类中使用 IDispEventImpl 的另一个实现。不过谢谢!
      猜你喜欢
      • 2014-12-04
      • 2016-05-25
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      相关资源
      最近更新 更多