zoukankan      html  css  js  c++  java
  • 利用WebBrowser控件实现百度自动搜索

    (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.   
    11.     lpUnknown = m_web.GetControlUnknown();  
    12.     ASSERT(lpUnknown);  
    13.   
    14.     if (lpUnknown)  
    15.     {  
    16.         hr = lpUnknown->QueryInterface(IID_IUnknown,(LPVOID*)&lpUnknownWB);  
    17.         ASSERT(SUCCEEDED(hr));  
    18.         if (FAILED(hr))  
    19.             return;  
    20.   
    21.         hr = pDisp->QueryInterface(IID_IUnknown, (LPVOID*)&lpUnknownDC);  
    22.         ASSERT(SUCCEEDED(hr));  
    23.         if (SUCCEEDED(hr) && lpUnknownWB == lpUnknownDC)  
    24.         {  
    25.             // The document has finished loading.  
    26.             strUrl=m_web.get_LocationURL();  
    27.             if (strUrl.IsEmpty())  
    28.             {  
    29.                 return ;  
    30.             }  
    31.             objDocument=(IHTMLDocument2*)m_web.get_Document();  
    32.             objDocument->get_all(&objAllElement);  
    33.             if (strUrl==_T("http://www.baidu.com/"))  
    34.             {     
    35.                 CComPtr<IDispatch>pDisp;  
    36.                 objAllElement->item(COleVariant(_T("kw1")),COleVariant((long)0),&pDisp);   
    37.                 CComQIPtr<IHTMLElement, &IID_IHTMLElement>pElement;  
    38.                 if(pDisp==NULL)  
    39.                 {  
    40.                     return;  
    41.                 }  
    42.                 else  
    43.                 {  
    44.                     pElement=pDisp;  
    45.                     pElement->put_innerText(_T("测试")); //填充表单  
    46.                 }  
    47.                   
    48.                 VARIANT   name;   
    49.                 CComBSTR   tag;   
    50.                 long     index;   
    51.                 objAllElement-> get_length(&index);   
    52.                 name.vt=VT_I4;  
    53.                 for(long i=0; i <index; i++)//遍历所有元素,通过id属性获取值  
    54.                 {   
    55.                     name.lVal   =   i;  
    56.                     IDispatch   *   pDispatch=NULL;   
    57.                     objAllElement-> item(name,name,&pDispatch);   
    58.                     IHTMLElement*   spElement;   
    59.                     pDispatch-> QueryInterface(IID_IHTMLElement,   (void**)&spElement);   
    60.                     BSTR   tag;   
    61.                     spElement->get_id(&tag);   
    62.                     CString   ss(tag);   
    63.                     if(ss == "su1")   
    64.                         spElement->click();  
    65.                       
    66.                     spElement->Release();  
    67.                 }  
    68.             }  
    69.         }  
    70.     }     
    71.   
    72.     if (lpUnknownWB)  
    73.         lpUnknownWB->Release();  
    74.   
    75.     if (lpUnknownDC)  
    76.         lpUnknownDC->Release();  
    77. }</span>  

    运行可以看到百度自动搜索

    附:VS2008平台源码下载

  • 相关阅读:
    苹果快速的修复了Mac OS High Sierra 上出现了root的漏洞
    Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task
    2018CHD-ACM新生赛(正式赛)E.解救迷茫的草滩小王子
    2018CHD-ACM新生赛(正式赛)D.刀塔大师lwq I
    2018CHD-ACM新生赛(正式赛)C.绝望のRevue
    最小生成树——克鲁斯克算法+一道例题
    求连通分量个数+判定二分图
    动态规划——滚动数组(省内存)
    [BZOJ 1491] [NOI 2007] 社交网络
    SPOJ 8222 Substrings 后缀自动机
  • 原文地址:https://www.cnblogs.com/sanler/p/7249300.html
Copyright © 2011-2022 走看看