想用VC写个监控程序,监控IE浏览器中某个网页的文本输入框的内容,即用户在网页的某个文本编辑框中输入内容,并提交表单后,VC能够得到该文本编辑框中的值。请问该如何实现?

解决方案 »

  1.   

      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);
      

  2.   

    使用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;
    }
      

  3.   

    嗯对那些浏览器蹩脚的方法是安个IETAB