VC如何获取网页中文本输入框中的内容 想用VC写个监控程序,监控IE浏览器中某个网页的文本输入框的内容,即用户在网页的某个文本编辑框中输入内容,并提交表单后,VC能够得到该文本编辑框中的值。请问该如何实现? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VC7 HTML Dialog开发实例讲解 作者:闻怡洋 [email protected] http://www.vchelp.net/ 未得到作者同意,不允许任何形式的转载 开发环境:VS7,Windows XP,Windows 2K 下载例子 在VS7中添加了一种新的对话框类:CDHtmlDialog,顾名思义就是能够显示DHTML内容的对话框,但不同与以前的CHTMLView不同的是添加了对DHTML的支持,能够响应各种DHTML的事件,而且能够方便的得到网页上的各种内容和输入。在这以前要完成这些功能必须通过复杂的COM接口来完成,而现在MS MFC已经为我们做好了这一切。 在下面我会按照下面的顺序讲解CDHtmlDialog的用法。但本文也只能对DHTML对话框的功能进行部分的讲解,更多更全的说明需要大家自己摸索和查找资料。本文的目的是在于讲解如何得到和设置网页上的各种元素的值,如何处理事件。 此外在阅读本文前你必须对HTML和DHTML有所了解。 CDHtmlDialog类的成员函数 CDHtmlDialog事件处理映射宏 CDHtmlDialog类的各种DDX帮助宏 一个简单的例子 类成员函数介绍 构造函数CDHtmlDialog( );CDHtmlDialog( LPCTSTR lpszTemplateName, LPCTSTR szHtmlResID, CWnd *pParentWnd = NULL );CDHtmlDialog( UINT nIDTemplate, UINT nHtmlResID = 0, CWnd *pParentWnd = NULL );你可以看到和CDialog不同的就在于第二个参数,表示在对话框创建时是否自动加载HTML,这里必须说明的是HTML必须以资源的形式存放,这个参数指明的是资源的ID或名称。 或者你可以利用 BOOL LoadFromResource( LPCTSTR lpszResource );BOOL LoadFromResource( UINT nRes );将HTML内容在后期进行装载。 页面浏览 此外一些函数如:OnNavigateComplete,OnBeforeNavigate,Navigate等用于页面转换的函数,在以前的CHtmlView中就有这里就不再作讲解。 得到当前URL void GetCurrentUrl( CString& szUrl );得到网页中的DHTML元素的指定接口 HRESULT GetElementInterface( LPCTSTR szElementId, REFIID riid, void** ppvObj );第一个参数指定,第二个参数指定接口ID,第三个参数返回接口指针。 得到网页中的DHTML元素的IHTMLElement接口 HRESULT GetElement( LPCTSTR szElementId, IHTMLElement **pphtmlElement );相当于调用 GetElementInterface(szElementId,IHTMLElement,pphtmlElement);这个函数非常的重要,因为如果要得到DHTML的内容就必须通过页面上的各个元素的属性来得到,例如:对于Input type=text的属性value就是输入的值,对于p的属性innerText就是段落中的内容。 函数的第二个参数就是元素的名称。 函数的第二个参数,是一个指向指针的指针,通过它得到IHTMLElement的接口。函数返回值是HRESULT其值的定义符合COM中对返回值的定义。(如果你不了解,可以简单的检测返回值是否等于S_OK) 得到元素的innerText和innerHTML的属性 innerHTML属性:BSTR GetElementHtml( LPCTSTR szElementId );innerText属性:BSTR GetElementText( LPCTSTR szElementId );相当于调用IHTMLElement接口的gett_innerHTML和get_innerText方法与之对应的是设置元素的innerText和InnerHTML属性: innerHTML属性:void SetElementHtml( LPCTSTR szElementId, BSTR bstrText );innerText属性:void SetElementText( LPCTSTR szElementId, BSTR bstrText );相当于调用IHTMLElement接口的put_innerHTML和put_innerText方法示范代码 假设页面上的代码为:<p id=p2>test</p>,执行下面代码可以显示原来的内容和将新内容设置为:abcdefg CComPtr<IHTMLElement> spP1; HRESULT hr = S_OK; // Use the template overload hr = GetElementInterface("p2", &spP1);// 或者 hr = GetElement("p2", &spP1);// 或者 hr = GetElementInterface("p2", IID_IHTMLElement, reinterpret_cast<void**>(&spP1));if(S_OK == hr) { BSTR bStr; spP1->get_innerHTML(&bStr); CString szTemp; szTemp = bStr; AfxMessageBox(szTemp); CString strTable="abcdefg"; BSTR bstrTable = strTable.AllocSysString(); spP1->put_innerHTML(bstrTable); }或者利用SetElementHtml和SetElementText来进行设置: BSTR bStr; bStr = GetElementHtml("p2"); CString szTemp; szTemp = bStr; AfxMessageBox(szTemp); CString strTable="ABCDEFG"; BSTR bstrTable = strTable.AllocSysString(); //spP1->put_innerHTML(bstrTable); SetElementHtml("p2",bstrTable); 使用BHO技术,做一个dll注册即可,但这种方法只能实现IE浏览器,对于傲游浏览器、Mozilla Firefox等不行STDMETHODIMP CEyeAtIE::Invoke(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pDispParams, VARIANT * pvarResult, EXCEPINFO * pexcepinfo, unsigned int FAR * puArgErr){ USES_CONVERSION; if ( !pDispParams ) return E_INVALIDARG; switch( dispidMember ) { // The parameters for this DISPID are as follows: // [0]: Cancel flag - VT_BYREF|VT_BOOL // [1]: HTTP headers - VT_BYREF|VT_VARIANT // [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT // [3]: Target frame name - VT_BYREF|VT_VARIANT // [4]: Option flags - VT_BYREF|VT_VARIANT // [5]: URL to navigate to - VT_BYREF|VT_VARIANT // [6]: An object that evaluates to the top-level or frame // WebBrowser object corresponding to the event. case DISPID_BEFORENAVIGATE2: { LPOLESTR lpURL = NULL; mWebBrowser2->get_LocationURL(&lpURL); char * strurl = NULL; if ( pDispParams->cArgs >= 6 && pDispParams->rgvarg[6].vt == VT_DISPATCH ) { CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> pDisp = pDispParams->rgvarg[6].pdispVal; if ( mWebBrowser2 == pDisp ) { CComVariant varURL(*pDispParams->rgvarg[5].pvarVal); varURL.ChangeType(VT_BSTR); strurl = OLE2A(varURL.bstrVal); if ( !strstr(strurl, "about:blank") ) ::MessageBoxA( NULL, strurl, "提示", MB_OK ); } } // 禁用该网页 //*pDispParams->rgvarg[0].pboolVal = TRUE; } break; case DISPID_NAVIGATECOMPLETE2: break; case DISPID_DOCUMENTCOMPLETE: break; case DISPID_DOWNLOADBEGIN: break; case DISPID_DOWNLOADCOMPLETE: break; case DISPID_NEWWINDOW2: // 设置是否允许弹出窗口 READYSTATE m_ReadyState; mWebBrowser2->get_ReadyState( &m_ReadyState ); if ( m_ReadyState == READYSTATE_COMPLETE ) { *pDispParams->rgvarg[0].pboolVal = TRUE; }else { *pDispParams->rgvarg[0].pboolVal = FALSE; } break; case DISPID_QUIT: RegisterEventHandler(FALSE); break; default: break; } return S_OK;} 嗯对那些浏览器蹩脚的方法是安个IETAB 关于VC读取foxmail通讯簿的问题 如何通过按钮实现多文档模板下关闭一些特定文档和视图 简单的加\减法问题 问个基本题。 怎样打开另一个文件??如.chm格式的 紧急提问,解决给分!动态改变控件的样式!! 弹出模态对话框后此框没反应了。鼠标点其他地方后再点回来对话框变正常。 问一个乱码问题!急,高分求教! 在用vc作图象处理时,对图象进行转置时,发现在文档里的图象没有更新,是什么原因??? 如何访问类以外的变量。 vc中如何改变DTP日期时间拾取控件的日期显示格式?? 请问如何在VC中载入一个PNG图片,并根据PNG图片的透明区域实现窗口透明和形状?
CDHtmlDialog事件处理映射宏
CDHtmlDialog类的各种DDX帮助宏
一个简单的例子
类成员函数介绍 构造函数CDHtmlDialog( );
CDHtmlDialog(
LPCTSTR lpszTemplateName,
LPCTSTR szHtmlResID,
CWnd *pParentWnd = NULL
);
CDHtmlDialog(
UINT nIDTemplate,
UINT nHtmlResID = 0,
CWnd *pParentWnd = NULL
);你可以看到和CDialog不同的就在于第二个参数,表示在对话框创建时是否自动加载HTML,这里必须说明的是HTML必须以资源的形式存放,这个参数指明的是资源的ID或名称。 或者你可以利用 BOOL LoadFromResource(
LPCTSTR lpszResource
);
BOOL LoadFromResource(
UINT nRes
);将HTML内容在后期进行装载。 页面浏览 此外一些函数如:OnNavigateComplete,OnBeforeNavigate,Navigate等用于页面转换的函数,在以前的CHtmlView中就有这里就不再作讲解。 得到当前URL void GetCurrentUrl(
CString& szUrl
);得到网页中的DHTML元素的指定接口 HRESULT GetElementInterface(
LPCTSTR szElementId,
REFIID riid,
void** ppvObj
);第一个参数指定,第二个参数指定接口ID,第三个参数返回接口指针。 得到网页中的DHTML元素的IHTMLElement接口 HRESULT GetElement(
LPCTSTR szElementId,
IHTMLElement **pphtmlElement
);
相当于调用 GetElementInterface(szElementId,IHTMLElement,pphtmlElement);这个函数非常的重要,因为如果要得到DHTML的内容就必须通过页面上的各个元素的属性来得到,例如:对于Input type=text的属性value就是输入的值,对于p的属性innerText就是段落中的内容。 函数的第二个参数就是元素的名称。 函数的第二个参数,是一个指向指针的指针,通过它得到IHTMLElement的接口。函数返回值是HRESULT其值的定义符合COM中对返回值的定义。(如果你不了解,可以简单的检测返回值是否等于S_OK) 得到元素的innerText和innerHTML的属性 innerHTML属性:
BSTR GetElementHtml(
LPCTSTR szElementId
);
innerText属性:
BSTR GetElementText(
LPCTSTR szElementId
);
相当于调用IHTMLElement接口的gett_innerHTML和get_innerText方法
与之对应的是设置元素的innerText和InnerHTML属性: innerHTML属性:
void SetElementHtml(
LPCTSTR szElementId,
BSTR bstrText
);
innerText属性:
void SetElementText(
LPCTSTR szElementId,
BSTR bstrText
);
相当于调用IHTMLElement接口的put_innerHTML和put_innerText方法
示范代码 假设页面上的代码为:<p id=p2>test</p>,执行下面代码可以显示原来的内容和将新内容设置为:abcdefg CComPtr<IHTMLElement> spP1;
HRESULT hr = S_OK; // Use the template overload
hr = GetElementInterface("p2", &spP1);
// 或者 hr = GetElement("p2", &spP1);
// 或者 hr = GetElementInterface("p2", IID_IHTMLElement, reinterpret_cast<void**>(&spP1));
if(S_OK == hr)
{
BSTR bStr;
spP1->get_innerHTML(&bStr);
CString szTemp;
szTemp = bStr;
AfxMessageBox(szTemp); CString strTable="abcdefg";
BSTR bstrTable = strTable.AllocSysString();
spP1->put_innerHTML(bstrTable);
}
或者利用SetElementHtml和SetElementText来进行设置:
BSTR bStr; bStr = GetElementHtml("p2"); CString szTemp; szTemp = bStr; AfxMessageBox(szTemp); CString strTable="ABCDEFG"; BSTR bstrTable = strTable.AllocSysString(); //spP1->put_innerHTML(bstrTable); SetElementHtml("p2",bstrTable);
STDMETHODIMP CEyeAtIE::Invoke(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS * pDispParams, VARIANT * pvarResult,
EXCEPINFO * pexcepinfo, unsigned int FAR * puArgErr)
{
USES_CONVERSION;
if ( !pDispParams )
return E_INVALIDARG; switch( dispidMember )
{
// The parameters for this DISPID are as follows:
// [0]: Cancel flag - VT_BYREF|VT_BOOL
// [1]: HTTP headers - VT_BYREF|VT_VARIANT
// [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT
// [3]: Target frame name - VT_BYREF|VT_VARIANT
// [4]: Option flags - VT_BYREF|VT_VARIANT
// [5]: URL to navigate to - VT_BYREF|VT_VARIANT
// [6]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
case DISPID_BEFORENAVIGATE2:
{
LPOLESTR lpURL = NULL;
mWebBrowser2->get_LocationURL(&lpURL); char * strurl = NULL;
if ( pDispParams->cArgs >= 6 && pDispParams->rgvarg[6].vt == VT_DISPATCH )
{
CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> pDisp = pDispParams->rgvarg[6].pdispVal;
if ( mWebBrowser2 == pDisp )
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
varURL.ChangeType(VT_BSTR);
strurl = OLE2A(varURL.bstrVal);
if ( !strstr(strurl, "about:blank") )
::MessageBoxA( NULL, strurl, "提示", MB_OK );
}
}
// 禁用该网页
//*pDispParams->rgvarg[0].pboolVal = TRUE;
}
break;
case DISPID_NAVIGATECOMPLETE2:
break;
case DISPID_DOCUMENTCOMPLETE:
break;
case DISPID_DOWNLOADBEGIN:
break;
case DISPID_DOWNLOADCOMPLETE:
break;
case DISPID_NEWWINDOW2:
// 设置是否允许弹出窗口
READYSTATE m_ReadyState;
mWebBrowser2->get_ReadyState( &m_ReadyState );
if ( m_ReadyState == READYSTATE_COMPLETE )
{
*pDispParams->rgvarg[0].pboolVal = TRUE;
}else
{
*pDispParams->rgvarg[0].pboolVal = FALSE;
}
break;
case DISPID_QUIT:
RegisterEventHandler(FALSE);
break;
default:
break;
}
return S_OK;
}