case DISPID_BEFORENAVIGATE2:
{
LPOLESTR lpURL = NULL;
mWebBrowser2->get_LocationURL(&lpURL);
char * strurl;
if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
varURL.ChangeType(VT_BSTR);
strurl = OLE2A(varURL.bstrVal);
}
if (strstr(strurl, "163.com") || strstr(strurl, "sohu.com"))
{
*pDispParams->rgvarg[0].pboolVal = TRUE;
MessageBox(NULL,"当前系统禁止浏览该页","警告",MB_ICONSTOP);
return S_OK;
}
break;
}
这个源码,是网上c++ bho最常见的屏蔽特定网站文章的源码,如何做成 打开 163.com 或者 sohu.com url就跳转到 http://www.csdn.net 呢?
解决方案 »
- vc sdk里面如何设置按钮的字体
- 先做人后做事,网络礼貌也很重要!散分并与大家共勉~
- 我使用WebBrowser控件浏览网页, 偶尔会出现控件区域全白或打开网页但无法点网页内的链接。
- 挑战你的逻辑,谁能给出最简单的代码
- 小弟准备学习网络编程,希望各位给点建议
- 对话框程序,咋没有构造函数和析构函数,若要最后销毁指针,在哪里弄呢?
- 请问如何向系统发送中文 keybd_event(0x30,0,0,0);keybd_event(0x30,0,KEYEVENTIF_KEYUP,0);
- snort,windump代码中有有关pop3,smtp的解析模块么?
- 浮动按钮如何实现
- 我算看清楚了
- 请问牛人:如何测量某个端口或者某个运行中的进程的网络流量?
- 对话框绘图,图片被截断。。。。(有问题图)
STDMETHODIMP CBhoApp::Invoke(DISPID dispidMember,REFIID riid,
LCID lcid,WORD wFlags,
DISPPARAMS *pDispParams,VARIANT
*pvarResult, EXCEPINFO *pExcepInfo,
UINT *puArgErr)
{
//在使用ATL字符串转换宏(此处用的是OLE2T)防止编译错误时,必须先调用这个宏
USES_CONVERSION; if(dispidMember == DISPID_BEFORENAVIGATE2)
{
BSTR bstrUrlName;
HRESULT hr = m_spWebBrowser2->get_LocationURL(&bstrUrlName);
if(FAILED(hr))
return hr; LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
lstrcpy(psz, OLE2T(bstrUrlName)); //此处,直接比较www.xyz.com,也可从一个要屏蔽的网站列表中进行比较。
if(stricmp("http://www.xyz.com/",psz) == 0)
{
VARIANT vFlags = ,vTargetFrameName = ; //如果不想显示"空白页",也可重定向至某个表明此网站已被屏蔽的页面。
m_spWebBrowser2->Navigate(SysAllocString(L"www.csdn.net"),&vFlags,&vTargetFrameName,
NULL,NULL); //这个设置要跳转的网址
m_spWebBrowser2->put_Visible(VARIANT_TRUE);
return S_FALSE;
}
return S_OK;
}
else if(dispidMember == DISPID_NAVIGATECOMPLETE2)
//检查以防止页面的post导航加载(post-navigation loading)
{
BSTR bstrUrlName;
HRESULT hr = m_spWebBrowser2->get_LocationURL(&bstrUrlName);
if(FAILED(hr))
return hr; //把文本从Unicode转换为ANSI
LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
lstrcpy(psz, OLE2T(bstrUrlName));
::OutputDebugString("In Navigate Complete");
::OutputDebugString(psz);
if(stricmp("http://www.xyz.com/",psz) == 0)
{
VARIANT vFlags = ,vTargetFrameName = ;
m_spWebBrowser2->Navigate(SysAllocString(L"www.csdn.net"),
&vFlags,&vTargetFrameName,
NULL,NULL); //这里设置要跳转的网址
m_spWebBrowser2->put_Visible(VARIANT_TRUE);
}
return S_OK;
}
return S_FALSE;
}
你只需要跳转一次就可以了,以下代码就不会死循环
将DISPID_BEFORENAVIGATE2中的代码注释掉或将DISPID_NAVIGATECOMPLETE2中的代码注释掉STDMETHODIMP CWebFilter::Invoke(DISPID dispidMember,REFIID riid,
LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT*pvarResult,
EXCEPINFO *pExcepInfo,UINT *puArgErr)
{
//在使用ATL字符串转换宏(此处用的是OLE2T)防止编译错误时,必须先调用这个宏
USES_CONVERSION;
if(dispidMember == DISPID_BEFORENAVIGATE2)
{
BSTR bstrUrlName;
HRESULT hr = m_spWebBrowser2->get_LocationURL(&bstrUrlName);
if(FAILED(hr))
return hr;
LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
lstrcpy(psz, OLE2T(bstrUrlName));
//此处,直接比较www.xyz.com,也可从一个要屏蔽的网站列表中进行比较。
if(stricmp("http://www.baidu.com/",psz) == 0)
{
VARIANT vFlags,vTargetFrameName;
//这里的代码注释掉就不会死循环了。当然也可以注释掉
//DISPID_NAVIGATECOMPLETE2消息中的代码
// m_spWebBrowser2->Navigate(SysAllocString(L"http://www.csdn.com/"),&vFlags,&vTargetFrameName,
// NULL,NULL);
// m_spWebBrowser2->put_Visible(VARIANT_TRUE); return S_FALSE;
}
return S_OK;
}
else if(dispidMember == DISPID_NAVIGATECOMPLETE2)
//检查以防止页面的post导航加载(post-navigation loading)
{
BSTR bstrUrlName;
HRESULT hr = m_spWebBrowser2->get_LocationURL(&bstrUrlName);
if(FAILED(hr))
return hr;
//把文本从Unicode转换为ANSI
LPTSTR psz = new TCHAR[SysStringLen(bstrUrlName)];
lstrcpy(psz, OLE2T(bstrUrlName));
::OutputDebugString("In Navigate Complete");
::OutputDebugString(psz);
if(stricmp("http://www.baidu.com/",psz) == 0)
{
VARIANT vFlags,vTargetFrameName;
m_spWebBrowser2->Navigate(SysAllocString(L"http://www.csdn.com/"),&vFlags,&vTargetFrameName,NULL,NULL);
m_spWebBrowser2->put_Visible(VARIANT_TRUE);
}
return S_OK;
}
return S_FALSE;
}
呵呵 搞笑了.不过你没直接问他 也给其他人造福了 MARK