求助,关于非MFC环境下如何挂接IWebBrowser2的新窗口事件

戒烟客 2012-07-27 02:48:06
求助,关于非MFC环境下如何挂接IWebBrowser2的新窗口事件


我的环境是使用duilib界面库,因为没有使用MFC,所以不知道如何处理IWebBrowser2的新窗口事件
请知道的各位指点指点


void CBrowserWnd::Init()
{
CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(paint_manager_.FindControl(_T("ie")));
if( pActiveXUI ) {
IWebBrowser2* pWebBrowser = NULL;
pActiveXUI->GetControl(IID_IWebBrowser2, (void**)&pWebBrowser);
if( pWebBrowser != NULL ) {
pWebBrowser->Navigate(L"http://www.baidu.com",NULL,NULL,NULL,NULL);
pWebBrowser->Release();
}
}

}

这样子可以正常浏览网页,但是新窗口弹出的界面该如何监控呢?
...全文
927 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_storm 2014-12-30
  • 打赏
  • 举报
回复
新版的控件没有处理这些消息吧,,, 没有处理DWebBrowserEvents2里的事件,
ma_yingkun 2013-01-03
  • 打赏
  • 举报
回复
楼主兄弟 人不错,谢谢分享, 装b的自重
ANDIDA 2012-10-31
  • 打赏
  • 举报
回复
虽然可以显示了,但是还是会弹出安装的浏览器窗口,请问如何屏蔽掉?
戒烟客 2012-09-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

楼主限制弹出新网页怎么解决的啊,能分享一下吗?
[/Quote]

上面的不是给出代码了吗,而且现在新版本已经自带有控件了,不必折腾了
slionls2011 2012-08-14
  • 打赏
  • 举报
回复
在NewWindow3t里应该如何处理?
xtj1986 2012-08-13
  • 打赏
  • 举报
回复
楼主设定新网页在本窗口显示,成功了吗?
xtj1986 2012-08-13
  • 打赏
  • 举报
回复
楼主限制弹出新网页怎么解决的啊,能分享一下吗?
xtj1986 2012-08-13
  • 打赏
  • 举报
回复
你现在改用CWebBrowserUI了没?
戒烟客 2012-07-31
  • 打赏
  • 举报
回复
有了吗?现在这个这样使用的确问题不少,顶起Dui
牛 魔 王 2012-07-31
  • 打赏
  • 举报
回复
楼主既然使用duilib那么现在新版本的有CWebBrowserUI控件了。
fishion 2012-07-29
  • 打赏
  • 举报
回复
http://blog.csdn.net/jinhill/article/details/4401080

给错了。。
戒烟客 2012-07-29
  • 打赏
  • 举报
回复
问题解决,谢谢各位的帮助!
戒烟客 2012-07-29
  • 打赏
  • 举报
回复
问题解决啦!!!
这是我的初始化函数

void CBrowserWnd::Init()
{
CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(paint_manager_.FindControl(_T("ie")));
if( pActiveXUI ) {
IWebBrowser2* pWebBrowser = NULL;
pActiveXUI->GetControl(IID_IWebBrowser2, (void**)&pWebBrowser);
if( pWebBrowser != NULL ) {
BSTR url= _bstr_t(gourl_.c_str());
VARIANT* vt= new VARIANT;
vt->bstrVal = url;
IConnectionPointContainer* pCPC = NULL;
IConnectionPoint* pCP = NULL;
pWebBrowser->QueryInterface(IID_IConnectionPointContainer,(void**)&pCPC);
pCPC->FindConnectionPoint( DIID_DWebBrowserEvents2,&pCP);
DWORD dwCookie = 0;
CMyWebBrwoser2Event* events = new CMyWebBrwoser2Event(NewWindow3t);
pCP->Advise( (IUnknown*)(void*)events,&dwCookie);
pWebBrowser->Navigate(url,NULL,NULL,NULL,NULL);
pWebBrowser->Release();
}
}

}

新窗口处理函数

bool _stdcall CALLBACK NewWindow3t(VARIANT_BOOL* Cannel,BSTR url){return true;}

从 DWebBrowsers2 派生的 CMyWebBrwoser2Event类


#include <ExDispid.h>
#include <Exdisp.h>

typedef bool (WINAPI * NewWindow3)(VARIANT_BOOL* Cannel,BSTR url);

class CMyWebBrwoser2Event : public DWebBrowserEvents2
{
private:
NewWindow3 _sc;
public:
CMyWebBrwoser2Event(NewWindow3 n3)
:_sc(n3)
{
}
public: // IDispatch methods
STDMETHOD(QueryInterface)( REFIID riid, void **ppvObject)
{
HRESULT hr = E_NOINTERFACE;
if (riid == __uuidof(IDispatch))
{
*ppvObject = (IDispatch*)this;
AddRef();
hr = S_OK;
}
else if (riid == __uuidof(DWebBrowserEvents2))
{
*ppvObject = (DWebBrowserEvents2*)this;
AddRef();
hr = S_OK;
}

return hr;
}
STDMETHODIMP_(ULONG) AddRef(void)
{
return 1;
};
STDMETHODIMP_(ULONG) Release(void)
{
return 1;
}
STDMETHOD(GetTypeInfoCount)(UINT*)
{
return E_NOTIMPL;
}
STDMETHOD(GetTypeInfo)(UINT, LCID, ITypeInfo**)
{
return E_NOTIMPL;
}

STDMETHOD(GetIDsOfNames)(REFIID, LPOLESTR *rgszNames, UINT, LCID, DISPID *rgDispId)
{
return E_NOTIMPL;
}

STDMETHOD(Invoke)(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS FAR* pDispParams,VARIANT FAR* pVarResult,EXCEPINFO FAR* pExcepInfo,unsigned int FAR* puArgErr)
{
HRESULT hr = S_OK;
if(dispIdMember == DISPID_DOCUMENTCOMPLETE)
{

}
if (dispIdMember == DISPID_NEWWINDOW3)
{

_sc((pDispParams->rgvarg[3].pboolVal),(pDispParams->rgvarg->bstrVal));
}

return hr;
}
};

XNightSky 2012-07-28
  • 打赏
  • 举报
回复
找到了
Handling HTML Element Events
http://msdn.microsoft.com/en-us/library/bb508508(v=vs.85).aspx

里面提到2种解决方案 MFC && ATL——
Handling Events using MFC
Handling Events using ATL

关键类和宏有了,再多我也不清楚了
戒烟客 2012-07-28
  • 打赏
  • 举报
回复
各位大哥大姐们帮帮忙了...
戒烟客 2012-07-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
通过连接点事件,挂接DWebBrowserEvents2 事件,然后就能处理浏览器的事件了
http://m426.mail.qq.com/cgi-bin/frame_html?sid=i_pqs5_teOv4VUsb&r=0176a3d132cd2c74dcdacf186cdfde27
[/Quote]

能给个代码提示吗?
fishion 2012-07-28
  • 打赏
  • 举报
回复
通过连接点事件,挂接DWebBrowserEvents2 事件,然后就能处理浏览器的事件了
http://m426.mail.qq.com/cgi-bin/frame_html?sid=i_pqs5_teOv4VUsb&r=0176a3d132cd2c74dcdacf186cdfde27
戒烟客 2012-07-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dahuaixiaohuai 的回复:]
IWebBrowser2事件要注册到系统,参考BHO开发。
[/Quote]

楼上的不是这样,因为我把浏览器加到我的程序,所以新窗口想在我的程序里面打开
戒烟客 2012-07-28
  • 打赏
  • 举报
回复
能够发一份给我吗?
戒烟客 2012-07-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
里面就有代码了
[/Quote]

这个是邮箱地址吧,我打开的话是跳转到我的QQ邮箱哦?
加载更多回复(2)

3,245

社区成员

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

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