首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

windows调用activex控件生成了一个ie浏览器窗口,怎么监听它的跳转事件

2014-01-05 
windows调用activex控件生成了一个ie浏览器窗口,如何监听它的跳转事件?我用activex控件生成了一个ie的浏览

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);

m_WebBrowser即是你的WebBrowser的activex控件对象,
m_spConnectPoint是一个连接点对象CComQIPtr<IConnectionPoint> m_spConnectPoint;
m_dwCookie是一个DWORD,用来保存与COM服务器的身份标示。
m_sink即是自己写的事件处理类实例化的一个对象。

如果不清楚的话可以看我写的这个简单的工程。VS2010的。
http://pan.baidu.com/s/1pJloiuR

如果对COM事件连接点,IDispatch接口,这些不熟悉的话,可以先看一下这方面的资料。
COM事件连接点:http://www.vckbase.com/index.php/wv/1257.html
点击这篇文章的作者“杨老师”,还可以看到他写的总共18篇COM组件的文章。通俗易懂。

热点排行