• WebBrowser 中遍历所有的frames


    枚举所有iframe的IWebBrowser2

    // Get the IDispatch of the document.
    //
    LPDISPATCH lpDisp = NULL;
    lpDisp = m_webBrowser.GetDocument();
    
    if (lpDisp)
    {
       IOleContainer* pContainer;
    
       // Get the container.
       //
       HRESULT hr = lpDisp->QueryInterface(IID_IOleContainer,
                                           (void**)&pContainer);
       lpDisp->Release();
    
       if (FAILED(hr))
          return hr;
    
       // Get an enumerator for the frames.
       //
       IEnumUnknown* pEnumerator;
    
       hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);
       pContainer->Release();
    
       if (FAILED(hr))
          return hr;
    
       IUnknown* pUnk;
       ULONG uFetched;
    
       // Enumerate and refresh all the frames.
       //
       for (UINT i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++)
       {
          // QI for IWebBrowser here to see whether we have 
          // an embedded browser.
          IWebBrowser2* pWebBrowser;
    
          hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pWebBrowser);
          pUnk->Release();
    
          if (SUCCEEDED(hr))
          {
             // Refresh the frame.
             pWebBrowser->Refresh();
             pWebBrowser->Release();
          }
       }
    
       pEnumerator->Release();
    }


    枚举所有iframe的element
    HRESULT hr = S_OK;
    
        try
        {
            CComPtr<IDispatch> spDispDoc;
            hr = m_spWebBrowser->get_Document(&spDispDoc);
    
            // find all iframe elements and filter by id, then insert ad js
            CComQIPtr<IHTMLDocument2> spDoc2 = spDispDoc;
    
            if(spDoc2){
                CComQIPtr<IHTMLElementCollection> spAll;
                hr = spDoc2->get_all(&spAll);
                if (SUCCEEDED(hr)) {
                    CComPtr<IDispatch> spDispObjects;
                    // just handle iframes as example
                    CComVariant varTag = _T("IFRAME"); 
                    varTag.vt = VT_BSTR;
                    hr = spAll->tags(varTag, &spDispObjects);
    
                    if(SUCCEEDED(hr))
                    {
                        CComQIPtr<IHTMLElementCollection> spElementCollection = spDispObjects;
                        long lObjectCount = 0;
                        if( spElementCollection )
                            hr = spElementCollection->get_length(&lObjectCount);if (SUCCEEDED(hr) && lObjectCount > 0)
                        {
                            for (int i = 0; i < lObjectCount; i++)
                            {
                                CComVariant vIndex = i;
                                CComVariant vEmpty;
                                CComPtr<IDispatch> spdispObject;
                                hr = spElementCollection->item(vIndex, vEmpty, &spdispObject);
                                if (SUCCEEDED(hr))
                                {
                                    CComQIPtr<IHTMLElement> spElement = spdispObject;
                                    if (spElement)
                                    {
                                        CComBSTR bstrId = _T("");;
                                        long width = 0, height = 0;
                                        spElement->get_id(&bstrId);
                                        spElement->get_offsetHeight(&height);
                                        spElement->get_offsetWidth(&width);
    
                                        if(!IsAcceptableSize(width, height))
                                            continue;
                         CComVariant vSrcUrl = _T("");
                                        hr = spElement->getAttribute(_T("src"), 0, &vSrcUrl);
     } } } } } } } } catch(_com_error &ex) { LPCTSTR errMsg = ex.ErrorMessage(); WriteLog(_T("_com_error: ") + CString(errMsg)); } return hr;



  • 相关阅读:
    小tips: HTTP 请求过程示例图及名称解释
    小tips:使用vuecli2脚手架配置vant自定义主题
    axios使用备忘录
    知乎问题:为什么很多web项目还是使用 px,而不是 rem?
    小tips:HTML5的ruby标签实现给汉字加拼音、details标签实现折叠面板、原生进度条progress和度量meter
    ES6之常用开发知识点:入门(一)
    GitBook相关使用以及配置笔记
    小tips:使用vue-cli脚手架搭建项目,关于eslint语法检测配置
    小tips:JS/CSS实现字符串单词首字母大写
    vue动态子组件的实现方式
  • 原文地址:https://www.cnblogs.com/dlbrant/p/3153093.html
Copyright © 2020-2023  润新知