MFC调用WebBrowser控件直接编写javascript代码及其他WebBrowser相关技巧

在mfc操作网页的过程中,使用ActiveX控件中的WebBrowser能方便的模拟网页点击等操作

头文件

#include <MsHTML.h>    //WEB控件包含头文件

有时需要直接编写javascript的代码来操作指定网页,可通过以下代码进行操作

CComVariant vtUrl(L"http://admin:123@172.31.102.12/cgi-bin/va100p.cgi");//指定需要打开的网页
CComVariant vtEmpty; 
myva100pwebbrower.Navigate2(&vtUrl, &vtEmpty, &vtEmpty, &vtEmpty, &vtEmpty);//打开指定网页
上下两部分要分开写,如果在网页还没打开的时候就进行下面的操作会直接报错
IHTMLDocument2* pHTMLDoc = (IHTMLDocument2*)myva100pwebbrower.get_Document();    
if ( pHTMLDoc != NULL ) 
{    
	IHTMLWindow2* pHTMLWnd;    
	pHTMLDoc->get_parentWindow( &pHTMLWnd );    
	if ( pHTMLWnd != NULL )    
	{  
		CString js_code;  
		js_code=L"javascript:document.getElementById('100').value = '11233'; void(0);";//此次为实际写入的javascript代码
		//js_code.Format(L"goToLocation('%s');",JScode);//JS函数名+参数  
		VARIANT  ret;    
		ret.vt = VT_EMPTY;  
		pHTMLWnd->execScript(js_code.AllocSysString(), L"Javascript", &ret);//执行javascript代码
	}  
} 


在大多数情况下,可以利用控件自带的函数进行网页元素的操作

CComQIPtr<IHTMLInputElement> spInputElement;
CComQIPtr<IHTMLDocument3> spDocument = myva100pwebbrower.get_Document();
CComPtr<IHTMLElement> spElement;
spDocument->getElementById(L"100", &spElement);//通过ID获得元素对象存在spElement中,这里的ID是100,接下来就可以对该对象进行操作
if(spElement==NULL)//读入ID之后可以先判断下该ID是否存在
{
	MessageBox(L"相应ID不存在");
	return;
}
//如果对象是下拉列表框,则经由下面代码进行选择
CComVariant vtUrl(L"1-door");
spElement->setAttribute(L"value",vtUrl); 
spElement.Release();//操作后要设释放掉元素对象  
//如果对象是按钮,可用下面方法进行模拟点击
spElement->click();
spElement.Release();
//如果对象是文本框,可用下面方法进行写入
spInputElement = spElement;
spInputElement->put_value(myinputbstr);
spElement.Release();
//如果对象有value,可用下面方法获得
BSTR BSvalue;
spInputElement = spElement;  
spInputElement->get_value(&BSvalue);//得到对象value放到BSvalue中


获得网页复选框对象的选择情况

bool getidcheck(CString myid, CExplorer1 *myweb)//myid为网页控件id,myweb为WebBrowser对象
{
	CComQIPtr<IHTMLInputElement> spInputElement;
	CComQIPtr<IHTMLDocument3> spDocument = myweb->get_Document();
	CComPtr<IHTMLElement> spElement;
	spDocument->getElementById(myid.AllocSysString(), &spElement);
	if (spElement == NULL)
	{
		return false;
	}
	bool getcheckvalue=false;
	spInputElement = spElement;
	VARIANT_BOOL vbgetcheckvalue = 0;
	spInputElement->get_checked(&vbgetcheckvalue);//获得复选框选择情况放到vbgetcheckvalue中
	if (vbgetcheckvalue==0)
	{
		getcheckvalue = false;
	}
	else
	{
		getcheckvalue = true;
	}
	spElement.Release();
	return getcheckvalue;
}

获得当前的URL(网址)

CString myweburl= myva100pwebbrower.get_LocationURL();//myva100pwebbrower为WebBrowser对象,myweburl存放着网址

如果不希望在程序运行时看到插件,可将插件进行隐藏,但可能是的一个bug,一旦在插件的属性中选择隐藏,它就干脆不起作用,这时可以使用下面这句代码进行操作,代码在窗体初始化的时候调用

::ShowWindow(myva100pwebbrower.GetSafeHwnd(), SW_HIDE);//其中myva100pwebbrower为WebBrowser对象

CString NetWorkDlg::getvalue(CString myid)//获得对象value值
{
	CComQIPtr<IHTMLInputElement> spInputElement;
	CComQIPtr<IHTMLDocument3> spDocument = networkweb.get_Document();
	CComPtr<IHTMLElement> spElement;
	spDocument->getElementById(myid.AllocSysString(), &spElement);
	if (spElement == NULL)//读入ID之后可以先判断下该ID是否存在  
	{
		MessageBox(L"相应ID不存在");
		return L"error";
	}
	VARIANT myvariant;
	spElement->getAttribute(L"value", 1, &myvariant);
	spElement.Release();//操作后要设释放掉元素对象  
	CString myvalue = myvariant;
	return myvalue;
}
void NetWorkDlg::setvalue(CString myid,CString myinput)//设置对象值
{
	CComQIPtr<IHTMLInputElement> spInputElement;
	CComQIPtr<IHTMLDocument3> spDocument = networkweb.get_Document();
	CComPtr<IHTMLElement> spElement;
	spDocument->getElementById(myid.AllocSysString(), &spElement);
	if (spElement == NULL)//读入ID之后可以先判断下该ID是否存在  
	{
		MessageBox(L"相应ID不存在");
		return;
	}
	CComVariant vtUrl;
	vtUrl = myinput;
	spElement->setAttribute(L"value", vtUrl);
	spElement.Release();//操作后要设释放掉元素对象
}














  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值