怎么才可以用程序实现向IE页面中的按钮发送被按下的消息呀?
还有:怎么才可以用程序实现向IE的编辑框里写入字符串呢?
大侠们帮帮忙!用VC实现!
分不够再加!

解决方案 »

  1.   

    ///////////////////////////////////////////////////////////////////////////////////////
    //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();
    }
      

  2.   

    查询IHtmlFormElement接口,调用submit方法
      

  3.   

    xmlhttp
    或者创建IE对象直接发送HTTP 或者Post请求最好.这比模拟单击速度快的多.
      

  4.   

    如果你不知道发送Post或查Get的内容和格式,可以借助于Microsoft Application center Test获取。
    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};
     __try{ 
     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:;
     }
      
     __finally{
     
     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;
          } 或者;
    int SendHTTPXML(LPCSTR URL,LPCSTR headers,const BYTE *Post, DWORD postLength,HTTPRequest* Buffer)
    { Buffer->dwSize =0;
    Buffer->dwHeadSize =0;
    Buffer->lpszResponseBody =NULL;
    Buffer->lpszResponseHeader =NULL;
    try
    {
    CoInitialize(NULL);
    MSXML::IXMLHttpRequestPtr pXH = NULL;
    HRESULT hr;
    if(FAILED(pXH.CreateInstance("Microsoft.XMLHTTP.1")))throw "Can not Create XMLHTTP Instance";
    if(Post!=NULL){
    hr=pXH->open(_bstr_t("POST"),_bstr_t(URL),CComVariant(VARIANT_FALSE),CComVariant(L""),CComVariant(L""));
    if(FAILED(hr))throw "POST Error";
    char *szBufferHeader=(char*)headers;
    char *szBufferLN;
    char *szComma;
    char szHeader[1024];
    char szHeaderValue[1024];
    if(headers!=NULL){
    while((szBufferLN=stristrA(szBufferHeader,"\r\n"))!=NULL){
    szComma=stristrA(szBufferHeader,": ");
    strncpy(szHeader,szBufferHeader,szComma-szBufferHeader);
    szHeader[szComma-szBufferHeader]=0;
    szBufferLN=stristrA(szComma,"\r\n");
    strncpy(szHeaderValue,szComma+2,szBufferLN-2-szComma);
    szHeaderValue[szBufferLN-2-szComma]=0;
    hr=pXH->setRequestHeader(_bstr_t(szHeader), _bstr_t(szHeaderValue));
    szBufferHeader=szBufferLN+2;
    }

    }
    hr=pXH->send(_variant_t((char*)Post));
    if(pXH->status >=200 && pXH->status <400){
    _bstr_t bstrResponseHeaders;
    _bstr_t bstrResponseText;
    bstrResponseHeaders=pXH->getAllResponseHeaders();
    bstrResponseText=pXH->responseText;
    USES_CONVERSION;
    int nLen=bstrResponseHeaders.length();
    Buffer->lpszResponseHeader =(BYTE*) malloc( nLen+1);
    ZeroMemory(Buffer->lpszResponseHeader,nLen+1);
    memcpy(Buffer->lpszResponseHeader,OLE2CT(bstrResponseHeaders),nLen);
    Buffer->dwHeadSize =nLen+1;

    nLen=bstrResponseText.length();
    ZeroMemory(Buffer->lpszResponseBody,nLen+1);
    Buffer->lpszResponseBody=(BYTE*)malloc(nLen+1);
    memcpy(Buffer->lpszResponseBody,OLE2CT(bstrResponseText),nLen);
    Buffer->dwSize=nLen+1;
    }
    }
    else
    {
    hr=pXH->open(_bstr_t(L"GET"),_bstr_t(URL),_variant_t(VARIANT_FALSE),_variant_t(L""),_variant_t(L""));
    if(FAILED(hr))throw "POST Error";
    char *szBufferHeader=(char*)headers;
    char *szBufferLN;
    char *szComma;
    char szHeader[1024];
    char szHeaderValue[1024];
    if(headers!=NULL){
    while((szBufferLN=stristrA(szBufferHeader,"\r\n"))!=NULL){
    szComma=stristrA(szBufferHeader,": ");
    strncpy(szHeader,szBufferHeader,szComma-szBufferHeader);
    szHeader[szComma-szBufferHeader]=0;
    szBufferLN=stristrA(szComma,"\r\n");
    strncpy(szHeaderValue,szComma+2,szBufferLN-2-szComma);
    szHeaderValue[szBufferLN-2-szComma]=0;
    hr=pXH->setRequestHeader(_bstr_t(szHeader), _bstr_t(szHeaderValue));
    szBufferHeader=szBufferLN+2;
    }

    }
    hr=pXH->send();
    if(pXH->status >=200 && pXH->status <400){
    _bstr_t bstrResponseHeaders;
    _bstr_t bstrResponseText;
    bstrResponseHeaders=pXH->getAllResponseHeaders();
    bstrResponseText=pXH->responseText;
    USES_CONVERSION;
    int nLen=lstrlen(OLE2CT(bstrResponseHeaders));
    Buffer->lpszResponseHeader =(BYTE*) malloc( nLen+1);
    ZeroMemory(Buffer->lpszResponseHeader,nLen+1);
    memcpy(Buffer->lpszResponseHeader,OLE2CT(bstrResponseHeaders),nLen);
    Buffer->dwHeadSize =nLen+1;

    nLen=lstrlen(OLE2CT(bstrResponseText));
    Buffer->lpszResponseBody =(BYTE*) malloc( nLen+1);
    ZeroMemory(Buffer->lpszResponseBody,nLen+1);
    Buffer->lpszResponseBody=(BYTE*)malloc(nLen+1);
    memcpy(Buffer->lpszResponseBody,OLE2CT(bstrResponseText),nLen);

    Buffer->dwSize=nLen+1;
    while(Buffer->lpszResponseBody[nLen-1]!='>')nLen--;
    Buffer->lpszResponseBody[nLen]=0;
    }
    }
    }
    catch(...)
    {//exception handling
    if(Buffer->lpszResponseBody!=NULL)free(Buffer->lpszResponseBody);
    if(Buffer->lpszResponseHeader!=NULL)free(Buffer->lpszResponseHeader);
    CoUninitialize();
    return 1;
    }
        
    CoUninitialize(); return 0;
    }
      

  5.   

    AnsiString __fastcall TForm3::Submit(void) { IHTMLDocument2 *pHTMLDoc = NULL; LPDISPATCH pDisp = NULL; pDisp =Web1->Document; if(pDisp) { if (SUCCEEDED(pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pHTMLDoc))) { pDisp->Release(); IHTMLElementCollection *pelement; if(pHTMLDoc->get_forms(&pelement)!=S_OK) { pHTMLDoc->Release(); pDisp->Release(); pelement->Release(); return "1发送失败"; } pDisp->Release(); tagVARIANT a,i; a.vt=VT_UI4; a.lVal=0;//这个值为你所要填写的表单在整个网页中的顺序,0为第一个表单 if(pelement->item(a,i,&pDisp)!=S_OK) { pelement->Release(); pDisp->Release(); return "2发送失败"; } pelement->Release(); IHTMLFormElement* pFormElem=NULL; if(pDisp) { if(!SUCCEEDED(pDisp->QueryInterface(IID_IHTMLFormElement,(LPVOID*)&pFormElem))) { pFormElem->Release(); pDisp->Release(); return "3发送失败"; } } else { return "31发送失败"; } pDisp->Release(); LPDISPATCH pDisp_msg = NULL; tagVARIANT phone,msg,empty; phone.vt=VT_UI4; phone.lVal=0;//这个值为Input框在表单中的顺序 msg.vt=VT_UI4; msg.lVal=1;//这个值为Text文本框在表单中的顺序 if((pFormElem->item(phone,empty,&pDisp)!=S_OK) ||(pFormElem->item(msg,empty,&pDisp_msg)!=S_OK)) { pFormElem->Release(); if(pDisp) pDisp->Release(); if(pDisp_msg) pDisp_msg->Release(); return "4发送失败"; } IHTMLInputTextElement* phoneElem=NULL; IHTMLTextAreaElement* msgElem; if(!pDisp||!pDisp_msg) return "11失败"; if (!SUCCEEDED(pDisp->QueryInterface(IID_IHTMLInputTextElement, (void**)&phoneElem)) ||(!SUCCEEDED(pDisp_msg->QueryInterface(IID_IHTMLTextAreaElement, (void**)&msgElem)))) { if(phoneElem) phoneElem->Release(); if(msgElem) msgElem->Release(); if(pDisp) pDisp->Release(); if(pDisp_msg) pDisp_msg->Release(); return "5发送失败"; } WideString s_phone,s_msg; s_phone="888888" s_msg="你好"; phoneElem->put_value(s_phone.c_bstr());//填写 msgElem->put_value(s_msg.c_bstr());//填写 pFormElem->submit();//提交 phoneElem->Release(); msgElem->Release(); pDisp->Release(); pDisp_msg->Release(); pFormElem->Release(); return "发送成功"; } } return "发送失败"; }