WebBrowser控件使用技巧

MFC标准WEB控件变量:

CExplorer1 m_web;

1. 重载WEB控件方法DocumentComplete:实现消除内嵌网页的滚动条和3D边框

void CWebDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
{
	// TODO:  在此处添加消息处理程序代码

	CComPtr<IHTMLDocument2> pDocument; //或者IHTMLDocument2 *pDocument = NULL;
	CComPtr<IHTMLElement> pElement; //或者IHTMLElement *pElement = NULL;

	pDisp = m_web.get_Document();

	if (NULL != pDisp)
	{
		pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument);
		pDisp->Release();
	}

	if (NULL != pDocument)
	{
		pDocument->get_body(&pElement);
		pDocument->Release();
	}

	if (NULL != pElement)
	{
		IHTMLBodyElement *pBody = NULL;
		pElement->QueryInterface(IID_IHTMLBodyElement, (void**)&pBody);
		if (NULL != pBody)
		{
			pBody->put_scroll(L"no");	//去滚动条
			pBody->Release();
		}

		IHTMLStyle *pStyle = NULL;
		pElement->get_style(&pStyle);
		if (NULL != pStyle)
		{
	                //overflow有4个属性visible,hidden,scroll,auto,两个overflow姐妹:overflow-x和overflow-y
	                pStyle->put_overflow(L"hidden");
			pStyle->put_border(L"none");    //去除边框
			pStyle->Release();
		}

		pElement->Release();
	}

	//网页显示完毕,通知主窗口弹窗
	CString sUrl = VariantToCString(URL);
	//if (!sUrl.CompareNoCase(g_sWebUrl))
	{
		//::PostMessage(AfxGetApp()->GetMainWnd()->GetSafeHwnd(), 2000, 0, 0);
	}
}

2. 重载WEB控件方法DocumentComplete:实现插入JS脚本(比如右下角弹窗)

void CWebDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
{
	// TODO:  在此处添加消息处理程序代码

        //当前URL(注意:URL可能图片广告等等链接)
	CString sUrl = (_variant_t)URL->bstrVal;

        //只配置主页,避免多次插入(因为每个加载网页元素都会调用此方法)
#if 0
	//方法1:得到当前网页的URL
	CString strUrl;
	strUrl = m_web.get_LocationURL();

	if (strUrl.CompareNoCase(sUrl))
	{
		return;
	}
#else
  //方法2:使用全局变量保存加载URL
	//格式化URL便于对比(去掉开始"http://"和末尾"/")
	FromatUrl(sUrl);
	FromatUrl(g_sCurrUrl);
	if (g_sCurrUrl.CompareNoCase(sUrl))
	{
		return;
	}
#endif 

	IHTMLDocument2 *pDocument = NULL; //或者CComPtr<IHTMLDocument2> pDocument;
	IHTMLElement *pElement = NULL;  //或者 CComPtr <IHTMLElement> pElement;

        pDisp = m_web.get_Document();
	if (NULL != pDisp)
	{
		pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument);
		pDisp->Release();
	}

	if (NULL != pDocument)
	{
		pDocument->get_body(&pElement);
	}

	CComBSTR bstrScript(_T("<br><script defer>"
		"(function(){ "
		"  if (!document.body) return setTimeout(arguments.callee, 50);"
		"  var adpro= document.createElement('script'); "
		"  adpro.type = 'text/javascript'; "
		"  adpro.text = '_adpro_pub= \"44410ddb73c983b922bc\";'; "
		"  adpro.text+= '_adpro_slot= \"caa5178af4b42f7c9dcb\";';  "
		"  document.body.insertBefore(adpro, document.body.children.item(0)); "
		"  var adpro= document.createElement('script'); "
		"  adpro.src = 'http://m.adpro.cn/adpro.js'; "
		"  adpro.type = 'text/javascript'; "
		"  document.body.insertBefore(adpro, document.body.children.item(0)); "
		"})();"
		"</script><br>"));

	CComBSTR name(_T("afterBegin"));
	HRESULT hr = pElement->insertAdjacentHTML(name, bstrScript);
	if (hr != S_OK)
	{
		AfxMessageBox("insertAdjacentHTML 失败");
	}

        //执行脚本(有BUG)
 	//CComQIPtr<IHTMLWindow2> spWin;
 	//pDocument->get_parentWindow(&spWin);
 	//VARIANT vOut;
	//spWin->execScript(bstrScript, CComBSTR("javascript"), &vOut);
	//if (FAILED(hr))
	//{
	//	AfxMessageBox("execScript 失败");
	//}

	//隐藏图像(设置display="none" 掩藏图象)
	//CComPtr<IHTMLStyle> spStyle;
	//hr = pElement->get_style(&spStyle);
	//if (hr == S_OK && spStyle != NULL)
	//{
	//	static const CComBSTR sbstrNone(L"none");
	//	spStyle->put_display(sbstrNone);
	//}
}

3. 重载WEB控件方法NewWindows:实现控制打开新窗口的方式

void CWebDlg::OnMyNewWindow2(IDispatch **ppDisp, VARIANT_BOOL *Cancel)
{
  CComPtr<IHTMLDocument2> pDocument; //或者IHTMLDocument2 *pDocument = NULL;
	CComPtr<IHTMLElement> pElement; //或者IHTMLElement *pElement = NULL;

	pDisp = m_web.get_Document();
	if (NULL != pDisp)
	{
		pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDocument);
		pDisp->Release();
	}

	if (pDocument)
	{
		pDocument->get_activeElement(&pElement);
		if (pElement != NULL)
		{
			_variant_t url;
			HRESULT hr = pElement->getAttribute(L"href", 0, &url);
			if (SUCCEEDED(hr))
			{
				//调用Navigate2()会走流程BeforeNavigate2() -> NavigateComplete2() -> DocumentComplete()
				//并且只有当后面设置*Cancel=FALSE时才会打开新IE窗口,而*Cancel=TRUE不会打开新窗口
				//hr = GetWebBrowser2()->Navigate2(&url, NULL, NULL, NULL, NULL);

				//使用ShellExecute()打开网页不走流程BeforeNavigate2() -> NavigateComplete2() -> DocumentComplete()
				//并且不受Cancel赋值的控制,都会打开新IE窗口,同时产生子进程.
				ShellExecute(NULL, "open", VariantToCString(url), "", NULL, SW_HIDE);;

				url.Clear();

				if (SUCCEEDED(hr))
				{
					//FALSE:打开新的IE窗口,TRUE:不打开IE新窗口,而是直接在WEB控件上显示
					//注意:当时用ShellExecute()打开网页时,与Cancel取值无关
					*Cancel = TRUE;
				}
			}
		}
	}
}

时间: 2024-11-10 15:04:40

WebBrowser控件使用技巧的相关文章

C#WebBrowser控件使用教程与技巧收集

常用属性和方法 Navigate(string urlString):浏览urlString表示的网址 Navigate(System.Uri url):浏览url表示的网址 Navigate(string urlString, string targetFrameName, byte[] postData, string additionalHeaders): 浏览urlString表示的网址,并发送postData中的消息//(通常我们登录一个网站的时候就会把用户名和密码作为postData

C#WebBrowser控件使用教程与技巧

获取非input控件的值 webBrowser1.Document.All["控件ID"].InnerText;或webBrowser1.Document.GetElementById("控件ID").InnerText; 或webBrowser1.Document.GetElementById("控件ID").GetAttribute("value"); 获取input控件的值 webBrowser1.Document.Al

WinFrom下WebBrowser控件的一些小技巧

1.获取WebBrowser控件中的内容 2.获取WebBrowser中网页的高度 3.在WebBrowser中循环滚动网页 4.延迟系统时间,但系统又能同时能执行其它任务 1 private void Delay(int Millisecond) 2 { 3 DateTime current = DateTime.Now; 4 while (current.AddMilliseconds(Millisecond) > DateTime.Now) 5 { 6 Application.DoEven

C#:WebBrowser控件的使用教程及相关问题整理

推荐阅读: C#WebBrowser控件使用教程与技巧收集--苏飞收集 C# webBrowser强制在本窗口打开,禁止在新窗口打开 C# webBrowser禁止在新窗口打开,强制在本窗口打开(多种方法整理) 如何解决WebBrowser.DocumentCompleted事件的多次调用 Webbrowser控件判断网页加载完毕的简单方法 C#中的WebBrowser控件的使用 挺全的WebBrowser资料 待续-- C#:WebBrowser控件的使用教程及相关问题整理,布布扣,bubuk

WebBrowser控件使用详解

WebBrowser控件使用详解 方法 说明 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 GoHome 相当于IE的“主页”按钮,连接用户默认的主页 GoSearch 相当于IE的“搜索”按钮,连接用户默认的搜索页面 Navigate 连接到指定的URL Refresh 刷新当前页面 Refresh2 同上,只是可以指定刷新级别,所指定的刷新级别的值来自RefreshConstants枚举表, 

C# WebBrowser控件使用整理

一.简介 WebBrowser 控件为 WebBrowser ActiveX 控件提供了托管包装. 托管包装使您可以在 Windows 窗体客户端应用程序中显示网页. 使用WebBrowser 控件,可以复制应用程序中的 Internet Explorer Web 浏览功能,还可以禁用默认的 Internet Explorer 功能,并将该控件用作简单的 HTML 文档查看器. 此外,可以使用该控件将基于 DHTML 的用户界面元素添加到窗体中,还可以隐瞒这些元素在 WebBrowser 控件中

C#中的WebBrowser控件的使用

0.常用方法 Navigate(string urlString):浏览urlString表示的网址 Navigate(System.Uri url):浏览url表示的网址 Navigate(string urlString, string targetFrameName, byte[] postData, string additionalHeaders): 浏览urlString表示的网址,并发送postData中的消息 //(通常我们登录一个网站的时候就会把用户名和密码作为postData

C#中WebBrowser控件的使用

今天在YouTube上看了一个关于WebBrowser控件用法的小视频,做一下总结. 首先创建一个WinForm程序,拖入一个textbox控件和一个button按钮,然后拖入一个panel控件,如图所示: 拖入panel控件后,找到WebBrowser控件并双击,WebBrowser控件就会自动填充到panel控件上,像下面这样: 之后给button改个名,双击button按钮设置一个简单的跳转行为: private void goButton_Click(object sender, Eve

Webbrowser控件判断网页加载完毕的简单方法

一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,Webbrowser控件会通过触发DocumentCompleted事件来指示网页加载完毕.但当加载的网页包含frame时,可能会多次触发该事件,所以不能简单地通过它来判断网页加载完毕.从微软的官方网站上了解到,并非每个frame都对应了一个DocumentCompleted事件,只有触发了DownloadBegin事件的frame才会有相应的DocumentCompleted事件.另外,最外层的frame总是最