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

lvshuchenyin 2014-01-04 03:36:37
我用activex控件生成了一个ie的浏览器窗口,能获取到IWebBrowser2这个接口。
请问我怎样才能后监听这个接口的事件?

比如我想捕获这个浏览器新建窗口的事件:NewWindow3,
我该如何做,才能后让这个事件发生时,调用我的函数来处理,控制要不要打开新窗口?

由于是直接使用,没法用继承的方法改写函数,有没有人知道怎么处理,谢谢!
...全文
201 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lvshuchenyin 2014-01-04
  • 打赏
  • 举报
回复
厉害!!!非常感谢!!!
encoderlee 2014-01-04
  • 打赏
  • 举报
回复
encoderlee 2014-01-04
  • 打赏
  • 举报
回复
使用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组件的文章。通俗易懂。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧