VC/MFC 從WebBrower 中獲取 HTML 和文字
阿新 • • 發佈:2019-01-03
本文部分轉載於 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();
}