1. 程式人生 > >利用WebBrowser控件實現百度自動搜索

利用WebBrowser控件實現百度自動搜索

span mic aid chang -m sso 分享 exchange patch

(1)新建一個MFC對話框項目

(2)對話框中添加WebBrower控件,添加方法:點擊菜單欄工具->選擇工具箱項->在彈出的選擇工具箱項對話框選擇COM組件->Microsoft Web Browser->確定,添加到對話框中即可。

技術分享

技術分享

技術分享

(3)添加類CWebBrowser2的頭文件和實現

右鍵點擊項目->添加->類->Visual C++ -> MFC->ActiveX控件中的MFC類->點擊添加按鈕->從註冊表來源添加類,可用的ActiveX控件選擇Microsoft Web Browser<1.0>->接口選擇IWebBrowser2->點擊>按鈕->點擊完成按鈕,就可以將CWebBrowser2.h和CWebBrowser2.cpp添加到項目中,XXXdlg.h中包含頭文件

#include "CWebbrowser2.h",定義變量CWebBrowser2 m_web;

(4)XXXdlg.cpp的DoDataExchange中添加將控件與變量動態綁定

DDX_Control(pDX, IDC_EXPLORER1, m_web);

(5)XXXdlg.cpp的初始化函數中添加

VARIANT vt;

COleVariant vaUrl=_T("http://www.baidu.com");

m_web.Navigate2(vaUrl,&vt,&vt,&vt,&vt);

運行程序,可以看到自動加載百度頁面。

技術分享

(6)XXXdlg.h中添加一下聲明,用於當頁面加載完成後進一步操作頁面

DECLARE_EVENTSINK_MAP()

void DocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT* URL);

(7)XXXdlg.cpp中添加

BEGIN_EVENTSINK_MAP(CbaiduDlg, CDialogEx)

ON_EVENT(CbaiduDlg, IDC_EXPLORER1, 259, CbaiduDlg::DocumentCompleteExplorer, VTS_DISPATCH VTS_PVARIANT)

END_EVENTSINK_MAP()

(8)實現DocumentCompleteExplorer

分析百度源碼可以得到輸入框的id是kw1,按鈕的id是su1。由於百度頁面標簽變化,自己註意替換。

技術分享

技術分享

[cpp] view plain copy
  1. <span style="font-size:18px;">void CbaiduDlg::DocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT* URL)
  2. {
  3. HRESULT hr;
  4. LPUNKNOWN lpUnknown;
  5. LPUNKNOWN lpUnknownWB = NULL;
  6. LPUNKNOWN lpUnknownDC = NULL;
  7. IHTMLElementCollection *objAllElement=NULL;
  8. IHTMLDocument2 *objDocument=NULL;
  9. CString strUrl,strTemp;
  10. lpUnknown = m_web.GetControlUnknown();
  11. ASSERT(lpUnknown);
  12. if (lpUnknown)
  13. {
  14. hr = lpUnknown->QueryInterface(IID_IUnknown,(LPVOID*)&lpUnknownWB);
  15. ASSERT(SUCCEEDED(hr));
  16. if (FAILED(hr))
  17. return;
  18. hr = pDisp->QueryInterface(IID_IUnknown, (LPVOID*)&lpUnknownDC);
  19. ASSERT(SUCCEEDED(hr));
  20. if (SUCCEEDED(hr) && lpUnknownWB == lpUnknownDC)
  21. {
  22. // The document has finished loading.
  23. strUrl=m_web.get_LocationURL();
  24. if (strUrl.IsEmpty())
  25. {
  26. return ;
  27. }
  28. objDocument=(IHTMLDocument2*)m_web.get_Document();
  29. objDocument->get_all(&objAllElement);
  30. if (strUrl==_T("http://www.baidu.com/"))
  31. {
  32. CComPtr<IDispatch>pDisp;
  33. objAllElement->item(COleVariant(_T("kw1")),COleVariant((long)0),&pDisp);
  34. CComQIPtr<IHTMLElement, &IID_IHTMLElement>pElement;
  35. if(pDisp==NULL)
  36. {
  37. return;
  38. }
  39. else
  40. {
  41. pElement=pDisp;
  42. pElement->put_innerText(_T("測試")); //填充表單
  43. }
  44. VARIANT name;
  45. CComBSTR tag;
  46. long index;
  47. objAllElement-> get_length(&index);
  48. name.vt=VT_I4;
  49. for(long i=0; i <index; i++)//遍歷所有元素,通過id屬性獲取值
  50. {
  51. name.lVal = i;
  52. IDispatch * pDispatch=NULL;
  53. objAllElement-> item(name,name,&pDispatch);
  54. IHTMLElement* spElement;
  55. pDispatch-> QueryInterface(IID_IHTMLElement, (void**)&spElement);
  56. BSTR tag;
  57. spElement->get_id(&tag);
  58. CString ss(tag);
  59. if(ss == "su1")
  60. spElement->click();
  61. spElement->Release();
  62. }
  63. }
  64. }
  65. }
  66. if (lpUnknownWB)
  67. lpUnknownWB->Release();
  68. if (lpUnknownDC)
  69. lpUnknownDC->Release();
  70. }</span>

運行可以看到百度自動搜索

技術分享

附:VS2008平臺源碼下載

利用WebBrowser控件實現百度自動搜索