用程序自动点击网页上的一个按钮,比如定时发一个MFC消息,然后打开html文件种的某个按钮,然后就自动执行下面的网页了

解决方案 »

  1.   

    这个我没有做过,但是我想你应该需要得到IHTMLDocument2接口,然后通过这个接口分析网页或是直接得到按钮,然后想办法触发它.
    关注中!
      

  2.   

    the following code will click submit button of html page in IE, modify it to click other button.
    ///////////////////////////////////////////////////////////////////////////////////////
    //click submit button of IE window
    //If it works, it is written by masterz,otherwise I don't
    //know who writes it^_^
    ///////////////////////////////////////////////////////////////////////////////////////
    void CGetIESrcDlg::NavigateToUrl()
    {
    // Import the following files in your stdafx.h
    // #import <mshtml.tlb> // Internet Explorer 5
    // #import <shdocvw.dll>
    //  Refer to "Connect to Internet Explorer Instances, From your own Process. " in www.codeguru.com
    SHDocVw::IShellWindowsPtr m_spSHWinds;
    CoInitialize(NULL);
    if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) == S_OK)
    {
    IDispatchPtr spDisp;
    long nCount = m_spSHWinds->GetCount();
    for (long i = 0; i < nCount; i++)
    {
    _variant_t va(i, VT_I4);
    spDisp = m_spSHWinds->Item(va);
    SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
    if (spBrowser != NULL)
    {
    IDispatchPtr spDisp;
    if(spBrowser->get_Document(&spDisp) == S_OK && spDisp!= 0 )
    {
    MSHTML::IHTMLDocument2Ptr spHtmlDocument(spDisp);
    MSHTML::IHTMLElementPtr spHtmlElement;
    if(spHtmlDocument==NULL)
    continue;
    spHtmlDocument->get_body(&spHtmlElement);
    if(spHtmlDocument==NULL)
    continue;
    HRESULT hr;
    MSHTML::IHTMLElementCollection* pColl=NULL;
    hr=spHtmlDocument->get_all(&pColl);
    if(pColl!=NULL&&SUCCEEDED(hr))
    {
    MSHTML::IHTMLElement* pElem=NULL;
    _variant_t index;
    index.vt=VT_I4;
    index.intVal=0;
    _variant_t name("Submit");
    IDispatchPtr disp;
    disp=pColl->item(name,index);
    if(disp==NULL)
    hr=E_FAIL;
    else
    {
    hr=disp->QueryInterface(&pElem);
    }
    if (SUCCEEDED(hr)&& pElem != NULL)
    {
    //
    BSTR bstrhtml;
    pElem->get_outerHTML(&bstrhtml);
    CString str(bstrhtml);
    AfxMessageBox(str);
    pElem->click();
    pElem->Release();
    }
    pColl->Release();
    }
    } }
    } }
    else {
    AfxMessageBox("Shell Windows interface is not avilable");
    }
    CoUninitialize();
    }
      

  3.   

    你直接采用想Form表单提交的URL地址利用填充的数据发送HTTP(Get、Post)请求不就行了码。如果你使用了IWebBrowser2接口,这个接口不是提供了一个Navigate方法吗?这个方法,在这个方法中你可以设定提交的参数值比如用户名和密码,作为入口参数,如果是Get请求,你可以把这些参数附在URL地址的后面,需要?和&字符。。就可以帮你提交这个请求。
      

  4.   

    microran2000,你说的正是我需要的,我需要解决的就是,分析Html文件中的<Input...>后的按钮,并自动定时用MFC消息来执行post请求。不过我对IWebBrowser2不熟悉,能否举个例子,我一定给你60分,想要再多的话,我开帖子给你~0~
      

  5.   

    microran2000,你说的正是我需要的,我需要解决的就是,分析Html文件中的<Input...>后的按钮,并自动定时用MFC消息来执行post请求。不过我对IWebBrowser2不熟悉,能否举个例子,我一定给你60分,想要再多的话,我开帖子给你~0~
      

  6.   

    分数是身外之物,你是我们之所以提供我们的建议和看法,是因为你提出的问题我们很感兴趣。对于不太感兴趣话题,即便很简单,我们也不愿意花时间的。
        我很少用MFC,我一般使用ATL和WTL编程。我觉得你可能采用的是WebBrowser控件,或者是基于HTML的视图。控件也好视图也好,它们都提供了一个Navigate方法,这个方法有一些参数,
    object.Navigate( _
        url As String, _
        [Flags As Variant,] _
        [TargetFrameName As Variant,] _
        [PostData As Variant,] _
        [Headers As Variant])
    只要Postdata不为null,控件就会向远程的服务器发送HTTP的Post请求,请求的URL地址(Action=指出)赋值给url,PostData附提交的数据,对于提交的数据是有表单控件名称=表单控件值用&符号连接而成。为了准确的获得提交的字符串,你可以采用一些HTTP协议的跟踪工具比如EffeTech HTTP Sniffer,使用IE浏览要浏览网页,截获IE向远程服务器提交的数据,然后使用构造HTTP头赋值给Headers,不过你在构造HTTP协议头的时候,一定要熟悉HTTP协议。对于Get请求,Postdata可以为空。对于Postdata,除了设置Postdata之外,还要设置Headers域中的Content_length字段等于提交数据的长度。并设置提交数据的格式.这个过程与你使用Socket发送请求或者XMLHTTP组件发送请求方法完全一样。
    下面是我编写的一个发送请求的片断供你参考:
    int SendHTTPByIE(LPCSTR URL,LPCSTR headers,const BYTE *Post, DWORD postLength)
    {
     HRESULT hr;
     USES_CONVERSION;
             IWebBrowserApp* pWBApp = NULL; // Derived from IWebBrowser
             BSTR bstrURL = NULL, bstrHeaders = NULL;
             VARIANT vFlags = {0},
             vTargetFrameName = {0},
             vPostData = {0},
                vHeaders = {0};   
     if (FAILED(hr = CoInitialize(NULL)))
             {
                return false;
             }       
     if (FAILED(hr = CoCreateInstance(CLSID_InternetExplorer,
                NULL,
                CLSCTX_SERVER,
                IID_IWebBrowserApp,
                (LPVOID*)&pWBApp)))
             {
                goto Error;
             } 
     bstrURL = SysAllocString(T2OLE(URL));
             if (!bstrURL)
             {
                goto Error;
             }  
     if(headers!=NULL){
      bstrHeaders = SysAllocString(T2OLE(headers));
    if (!bstrHeaders)
    {
                goto Error;
         }    
     V_VT(&vHeaders) = VT_BSTR;
     V_BSTR(&vHeaders) = bstrHeaders;      
     }
     if(Post!=NULL){
      hr = GetPostData(&vPostData,(LPCTSTR)Post,postLength);
     }
             hr = pWBApp->Navigate(bstrURL, &vFlags,
                      &vTargetFrameName, &vPostData, &vHeaders);
             pWBApp->put_Visible(VARIANT_TRUE);  
        Error:
             if (bstrURL) SysFreeString(bstrURL);
             if (bstrHeaders) SysFreeString(bstrHeaders);
             if(Post!=NULL)VariantClear(&vPostData);
             if (pWBApp){
     pWBApp->Release();
     pWBApp=NULL;
     }
             CoUninitialize();
    return true;
    }
          HRESULT GetPostData(LPVARIANT pvPostData,LPCTSTR szPostData, DWORD postLength)
          {
             HRESULT hr;
             LPSAFEARRAY psa;
             
             LPSTR pPostData;  
     if (!pvPostData)
             {
                return E_POINTER;
             }  
     VariantInit(pvPostData); 
     psa = SafeArrayCreateVector(VT_UI1, 0, postLength);
             if (!psa)
             {
                return E_OUTOFMEMORY;
             } 
     hr = SafeArrayAccessData(psa, (LPVOID*)&pPostData);
             memcpy(pPostData, szPostData, postLength);
             hr = SafeArrayUnaccessData(psa);
             V_VT(pvPostData) = VT_ARRAY | VT_UI1; 
             V_ARRAY(pvPostData) = psa;
             return NOERROR;
          }