windows调用activex控件生成了一个ie浏览器窗口,如何监听它的跳转事件?
我用activex控件生成了一个ie的浏览器窗口,能获取到IWebBrowser2这个接口。
请问我怎样才能后监听这个接口的事件?
比如我想捕获这个浏览器新建窗口的事件:NewWindow3,
我该如何做,才能后让这个事件发生时,调用我的函数来处理,控制要不要打开新窗口?
由于是直接使用,没法用继承的方法改写函数,有没有人知道怎么处理,谢谢!
[解决办法]
使用COM事件连接点,连接WebBrowser的事件接口DWebBrowserEvents2。
其实CHtmlView里的OnNewWindow2之类的事件处理虚函数这是这么实现的。
DWebBrowserEvents2接口的MSDN说明:http://msdn.microsoft.com/en-us/library/aa768283(v=vs.85).aspx
首先写个自己的事件处理类,派生于IDispatch。
class CSink : public IDispatch
然后先在里面实现从IUnknown和IDispatch继承来的纯虚函数:
QueryInterface
AddRef
Release
GetTypeInfoCount
GetTypeInfo
GetIDsOfNames
由于我们的事件处理接口CSink不需要这些功能,写的时候简单的return一下就行了。
最重要的是Invoke。
我们将在Invoke这个纯虚函数的实现里进行事件处理。
在Invoke里,用一个switch来判断dispID。
如果dispID是DISPID_NEWWINDOW3,说明WebBrowser准备打开一个新窗口。
这时根据MSDN的说明:
http://msdn.microsoft.com/en-us/library/aa768288(v=vs.85).aspx
第二个参数决定是否拦截这个新窗口。
由于参数数组DISPPARAMS * pParams中的参数是逆序放置的,这个事件总共传递5个参数,
我们需要的第二个参数正是参数数组中的倒数第二个参数,也就是第三个参数。
于是我们在Invoke中这样写:
switch (dispID)
{
case DISPID_NEWWINDOW3:
AfxMessageBox(L"拦截打开新窗口!");
*pParams->rgvarg[3].pboolVal = VARIANT_TRUE;
break;
default:
break;
}
return S_OK;
//获得WebBrowser的连接点容器
CComQIPtr<IConnectionPointContainer> spContainer(m_WebBrowser.GetControlUnknown());
//找到我们需要的事件接口 DWebBrowserEvents2
spContainer->FindConnectionPoint(__uuidof(DWebBrowserEvents2), &m_spConnectPoint);
//连接上连接点
HRESULT h = m_spConnectPoint->Advise(&m_sink, &m_dwCookie);