Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从IE扩展检测网页中的滚动_C++_Visual Studio 2008_Internet Explorer_Scrollbar - Fatal编程技术网

C++ 从IE扩展检测网页中的滚动

C++ 从IE扩展检测网页中的滚动,c++,visual-studio-2008,internet-explorer,scrollbar,C++,Visual Studio 2008,Internet Explorer,Scrollbar,我正在创建一个IE扩展(使用VS2008,C++),它需要对IE中的滚动条事件做出反应。我正在使用BHO,并且我可以访问父窗口的IWebBrowser2元素、IHTMLDocument2元素和HWND。我不知道如何访问滚动条。我见过一些代码,这些代码允许我在访问滚动条后处理滚动条,但不允许我自己获取滚动条对象(或者它们是IE窗口的子窗口?)。有什么想法吗?MSHTML呈现自己的滚动条,而不是使用本机系统控件。这就是为什么您可以对它们应用CSS规则 我想尝试的是: QueryInterface()

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

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

我想尝试的是:

  • QueryInterface()调用IHTMLDocument2 对象,用于ihtmlement
  • 查询接口()用于 i连接点容器
  • 然后打电话 IConnectionPointContainer::FindConnectionPoint(DIID_HTMLElementEvents2)
  • 实现IDispatch::Invoke()和 你应该得到 事件,当有人滚动 文件
  • 冲洗并重复子框架

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

    我想尝试的是:

  • QueryInterface()调用IHTMLDocument2 对象,用于ihtmlement
  • 查询接口()用于 i连接点容器
  • 然后打电话 IConnectionPointContainer::FindConnectionPoint(DIID_HTMLElementEvents2)
  • 实现IDispatch::Invoke()和 你应该得到 事件,当有人滚动 文件
  • 冲洗并重复子框架

  • 由于我已经实现了IDispatch::Invoke方法,我猜我必须重写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()
    .
    .
    .
    }
    
    class ATL\u NO\u VTABLE CHelloWorldBHO:
    公共CComObjectRootEx,
    公共课程,
    具有SiteImpl的公共对象,
    公共场所,
    公共IDispenTempl
    {
    .
    .
    .
    开始下沉地图(CHelloWorldBHO)
    接收项(1,DIID\U DWebBrowserEvents 2,DISPID\u DOCUMENTCOMPLETE,OnDocumentComplete)
    SINK_ENTRY_EX(1,DIID_DWebBrowserEvents2,DISPID_BEFORENAVIGATE2,BEFORENAVIGATE2)//句柄BEFORENAVIGATE2
    END_SINK_MAP()
    .
    .
    .
    }
    
    谢谢


    编辑:我发现当调用被覆盖时,OnDOcumentCOmplete永远不会被调用。如何解决这个问题?

    既然我已经实现了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()
    .
    .
    .
    }
    
    class ATL\u NO\u VTABLE CHelloWorldBHO:
    公共CComObjectRootEx,
    公共课程,
    具有SiteImpl的公共对象,
    公共场所,
    公共IDispenTempl
    {
    .
    .
    .
    开始下沉地图(CHelloWorldBHO)
    接收项(1,DIID\U DWebBrowserEvents 2,DISPID\u DOCUMENTCOMPLETE,OnDocumentComplete)
    SINK_ENTRY_EX(1,DIID_DWebBrowserEvents2,DISPID_BEFORENAVIGATE2,BEFORENAVIGATE2)//句柄BEFORENAVIGATE2
    END_SINK_MAP()
    .
    .
    .
    }
    
    谢谢


    编辑:我发现当调用被覆盖时,OnDOcumentCOmplete永远不会被调用。我该如何解决这个问题?

    谢谢你的回答。由于我使用ATL,我意识到我可以在我的类中使用IDispenTempl的另一个实现。谢谢你!谢谢你的回答。由于我使用ATL,我意识到我可以在我的类中使用IDispenTempl的另一个实现。谢谢你!