C++ 从IE扩展检测网页中的滚动
我正在创建一个IE扩展(使用VS2008,C++),它需要对IE中的滚动条事件做出反应。我正在使用BHO,并且我可以访问父窗口的IWebBrowser2元素、IHTMLDocument2元素和HWND。我不知道如何访问滚动条。我见过一些代码,这些代码允许我在访问滚动条后处理滚动条,但不允许我自己获取滚动条对象(或者它们是IE窗口的子窗口?)。有什么想法吗?MSHTML呈现自己的滚动条,而不是使用本机系统控件。这就是为什么您可以对它们应用CSS规则 我想尝试的是: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()
MSHTML呈现自己的滚动条,而不是使用本机系统控件。这就是为什么您可以对它们应用CSS规则 我想尝试的是:
由于我已经实现了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的另一个实现。谢谢你!