1. 程式人生 > >VC/MFC 從WebBrower 中獲取 HTML 和文字

VC/MFC 從WebBrower 中獲取 HTML 和文字

本文部分轉載於 http://blog.chinaunix.net/uid-2516614-id-2496197.html

用於參考

///////////////////////////////////////////////////////////////

外部視窗介面獲取(非原部落格,是自己新增的其他通過獲取IE瀏覽器視窗的控制代碼,在由控制代碼轉換成IE的介面):

void CHTMLContrlDlg::OnBnClickedButtonOpen()
{
	// TODO: 在此新增控制元件通知處理程式程式碼
	

	HWND ExplorerWnd = ::FindWindow(NULL, _T("CrystalDiskMark 3.0 x64"));

	
	//根據IE主視窗獲取瀏覽器視窗
	  
	  if (!ExplorerWnd)
		::MessageBox(m_hWnd, TEXT("CrystalDiskMark - Internet Explorer"), NULL, MB_OK);

	else
	{
		if (m_WinThread)
		{
			return;
		}

		m_WinThread  = AfxBeginThread(MyThreadRead, (void*)this);
		::SetForegroundWindow(ExplorerWnd);
		FindWindowsHwnd(ExplorerWnd);
	}

}


void CHTMLContrlDlg::FindWindowsHwnd(HWND hWnd)
{

	HWND hWndChild = NULL;
	::EnumChildWindows(hWnd, EnumChildProc, (LPARAM)&hWndChild);

	if (NULL == hWndChild) return;

	UINT nMsg = ::RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));
	LRESULT lRes;

	::SendMessageTimeout(hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes);

	CComPtr < IHTMLDocument2 > spDoc;
	
	
HRESULT hr = ::ObjectFromLresult(lRes, IID_IHTMLDocument2, 0, (LPVOID *)&spDoc); if (FAILED(hr)) return ; // 程式執行到此,已經找到了 IHTMLDocument2 的介面指標 CComBSTR bstrTitle; spDoc->get_title(&bstrTitle);//取得文件標題 CString str(bstrTitle); SetWindowText(str); CComPtr < IHTMLElementCollection > spElementCollection; hr = spDoc->get_all(&spElementCollection);
if (FAILED(hr)) { return; } long elementLength; hr = spElementCollection->get_length(&elementLength);////獲取HTML元素數量 if (FAILED(hr)) { return; }   //接下來就可以通過指標迴圈查詢元素,根據自己的查詢條件判別要找的元素 VARIANT name; CComBSTR tag; name.vt = VT_I4; for (int i = 0; i < elementLength; i++) { name.lVal = i; IDispatch * pDispatch = NULL; HRESULT res = spElementCollection->item(name, name, &pDispatch); if (FAILED(res)) { continue; } CComPtr<IHTMLElement> pHtmlElement;////IHTMLSelectElement是你想找的元素型別,
還有IHTMLSpanElement、IHTMLElement、IHTMLSpanElement等
		hr = pDispatch->QueryInterface(IID_IHTMLElement, (void**)&pHtmlElement);
	        
		if (FAILED(hr))
		{
			continue;
		}
		BSTR id;
		BSTR _innerText;
		pHtmlElement->get_id(&id);
		pHtmlElement->get_innerText(&_innerText);
           }
}

///////////////////////////////////////////////////////////////

 本程式碼是關於 從 ACTIVEX控制元件 WebBrower 中獲取 HTML 和文字。
本程式碼來自網路,從哪裡來不記得了。
  原來程式碼中有獲得HTML,但是我專案中的目的是得到HTML中的文字。料想 自己還要寫一個HTML-->TXT
的程式碼來解決最後的問題。寫著寫著看到 hr=pElement->get_outerHTML();這個程式碼 和javascript中的inner***很類似。如是利用自動不起功能居然發現了pElement->get_outerText(&pContent);於是直接省略了
HTML-->TXT的程式碼。。噢 吔!!!

pBrowse = (CWebBrowser2*)this->GetDlgItem(IDC_EXPLORER3);
    IHTMLDocument2 *pHTMLDocument=NULL;
    if (!(pHTMLDocument = (IHTMLDocument2*)pBrowse->GetDocument()))
        return;
    CComPtr<IHTMLElementCollection> pAllColl;
    HRESULT hr;
    hr=pHTMLDocument->get_all(&pAllColl);
    if(hr==S_OK){
        LONG length=0;
        hr=pAllColl->get_length(&length);
        if(hr==S_OK){
            for(int i=0;i<length;i++){
                VARIANT vIndex,vName;
                vName.vt=vIndex.vt=VT_I4;
                vName.lVal=vIndex.lVal=i;
                CComPtr<IDispatch> pDisp;
                hr=pAllColl->item(vName,vIndex,&pDisp);
                if( hr==S_OK ){
                    CComPtr<IHTMLElement> pElement;
                    hr=pDisp->QueryInterface(IID_IHTMLElement,(void**)&pElement);
                    if( hr==S_OK ){
                        CComBSTR tagName;
                        hr=pElement->get_tagName(&tagName);
                        if(hr==S_OK){
                            CString str(tagName);
                            if(str=="HTML"){
                                CComBSTR pContent;
                                hr=pElement->get_outerText(&pContent);
                                //hr=pElement->get_outerHTML();

                                if(hr==S_OK){

                                    UpdateData(true);
                                    m_text = CString(pContent);
                                    UpdateData(false);
                                    i=length;//以便退出迴圈

                                }
                                else{//if get_outerHTML failed

                                 MessageBox("can't get html code");
                                }
                            }//else if tagName isnot 'HTML'

                        }//else if get_tagName failed

                    }//else if don't get IHMTLElement interface

                }//if no items

            }
        }//if get_length failed

    }//if get_all failed

    pHTMLDocument->Release();
}