好像是ole技术!msdn中写的可以用IWebBrowser2控制一个ie实例!有什么办法吗?

解决方案 »

  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.   

    //Get IHTMLDocument2 interface from HWND
    IHTMLDocument2* GetDocInterface(HWND hWnd) 
    {
    // 我们需要显示地装载OLEACC.DLL,这样我们才知道有没有安装MSAA
    HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
    IHTMLDocument2* pDoc2=NULL;
    if ( hInst != NULL ){
    if ( hWnd != NULL ){
    CComPtr<IHTMLDocument> spDoc=NULL;
    LRESULT lRes; UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
    ::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes ); LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
    if ( pfObjectFromLresult != NULL ){
    HRESULT hr;
    hr=pfObjectFromLresult(lRes,IID_IHTMLDocument,0,(void**)&spDoc);
    if ( SUCCEEDED(hr) ){
    CComPtr<IDispatch> spDisp;
    CComQIPtr<IHTMLWindow2> spWin;
    spDoc->get_Script( &spDisp );
    spWin = spDisp;
    spWin->get_document( &pDoc2 );
    }
    }
    }
    ::FreeLibrary(hInst);

    else{//如果没有安装MSAA
    AfxMessageBox(_T("请您安装Microsoft Active Accessibility"));
    }
    return pDoc2;

    HOWTO: Get IHTMLDocument2 from a HWND(根据HWND取得IHTMLDocument2接口)(http://support.microsoft.com/default.aspx?scid=kb;EN-US;q249232
    /*函数名:GetDocInterfaceByMSAA
      参数:hwnd,WebBrowser控件的窗口句柄
      功能:取得hwnd对应的Webbrowser控件的IHTMLDocument2*接口.
    */
    IHTMLDocument2* GetDocInterfaceByMSAA(HWND hwnd)
    {
    HRESULT hr;
    HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); IHTMLDocument2* pDoc2=NULL;
    if ( hInst != NULL ){
    if ( hwnd != NULL ){
    //取得AccessibleObjectFromWindow函数
    LPFNACCESSIBLEOBJECTFROMWINDOW pfAccessibleObjectFromWindow =
    (LPFNACCESSIBLEOBJECTFROMWINDOW)::GetProcAddress(hInst,_T("AccessibleObjectFromWindow"));
    if(pfAccessibleObjectFromWindow != NULL){
    CComPtr spAccess;
    hr=pfAccessibleObjectFromWindow(hwnd,0,
    IID_IAccessible,(void**) &spAccess);//取得Webbrowser控件的IAccessible接口
    if ( SUCCEEDED(hr) ){
    CComPtr spServiceProv;
    hr=spAccess->QueryInterface(IID_IServiceProvider,(void**)&spServiceProv);
    if(hr==S_OK){
    CComPtr spWin;
    hr=spServiceProv->QueryService(IID_IHTMLWindow2,IID_IHTMLWindow2,
    (void**)&spWin);
    /*
    注意:并不是每次都能取得IHTMLWindow2接口,如果调用失败,可以尝试取得IHTMLElement接口:
    CComPtr spElement;
    hr=spServiceProv->QueryService(IID_IHTMLElement,IID_IHTMLElement,(void**)&spElement);
    */
    if(hr==S_OK)
    spWin->get_document(&pDoc2);
    }
    }
    }
    }
    ::FreeLibrary(hInst);
    }
    else{
    AfxMessageBox(_T("请您安装Microsoft Active Accessibility"));
    }
    return pDoc2;
    }void SetPassword(IHTMLDocument2 *pDoc2,POINT pt,CString strName)
    {
    if(pDoc2==NULL)return "";
    CComPtr<IHTMLElement> pElement;
    HRESULT hr=pDoc2->elementFromPoint(pt.x,pt.y,&pElement);
    if(SUCCEEDED(hr)){
    CComPtr<IHTMLInputTextElement> pPwdElement;
    hr=pElement->QueryInterface(IID_IHTMLInputTextElement,
    (void**)&pPwdElement);
    if(SUCCEEDED(hr)){
    CComBSTR type;
    hr=pPwdElement->get_type(&type);
    if(SUCCEEDED(hr)){
    if(type==_T("password")){
    CComBSTR pwd;
    hr=pPwdElement->put_value(strName);
    if(SUCCEEDED(hr)){
    if(pwd.Length()!=0){
    CComBSTR msg;
    msg=pwd;
    CString str(msg);
    return str;
    }
    else{
    return "";
    }
    }
    }
    }
    }
    }
        pDoc2->Release();
       return "";
     }