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

来源:http://www.cnblogs.com/sanler/archive/2017/07/28/7249300.html
-Advertisement-
Play Games

(1)新建一個MFC對話框項目 (2)對話框中添加WebBrower控制項,添加方法:點擊菜單欄工具->選擇工具箱項->在彈出的選擇工具箱項對話框選擇COM組件->Microsoft Web Browser->確定,添加到對話框中即可。 (3)添加類CWebBrowser2的頭文件和實現 右鍵點擊項目 ...


(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平臺源碼下載


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Owin Startup 類解析 每個 Owin 程式都有 startup 類,在這個 startup 類裡面你可以指定應用程式管道模型中的組件。你可以通過不同的方式來連接你的 startup 類和運行時,這些取決於你選擇的宿主模型(OwinHost, IIS, and IIS-Express)。 ...
  • C#Socket 網路通信非同步處理 SocketAsyncEventArgs 非同步套接字操作 1.服務端簡單實現: 2.客戶端簡單實現: ...
  • 背景:以前做登錄時用的都是FormsAuthentication.SetAuthCookie(model.UID, IsRemeber),但是有一個不好,不能存儲多個值,有時候我們既想存儲登錄用戶的UID又想存儲用戶名,以前都是將兩者拼接成字元串,用的時候在split出來,比較麻煩,現在用Claim ...
  • 首先,我們需要做的是什麼? 我們成功登錄之後,跳轉到主界面,然後主界面的登錄按鈕變成頭像啥的。下一次打開網頁就要判斷有沒有登錄過,有cookie就不需要登錄,直接顯示頭像 1.成功登錄後,客戶端請求伺服器 2.把登陸信息傳入到伺服器 3.伺服器有了這個cookie,保存到cookie集合裡面,然後反 ...
  • 出現這個原因我們應該都能猜測到,文件傳出過大,超出了WCF預設範圍,那麼我們需要進行修改。 服務端和客戶端都需要修改。 第一、客戶端: 上面是wcf客戶端預設生成的,如需要修改傳輸文件大小,需要一下改動 <binding name="BasicHttpBinding_ITaskService" ma ...
  • IIS 中的 Owin 在 IIS 裡面部署 Owin,既能得到 Owin 管道模型的靈活性和模塊特性,也能很好地利用 IIS 成熟的配置,Owin 程式將會跑在 ASP.NET request 的管道中。 首先建一個空的 Web 項目 添加 Nuget 包 Microsoft.Owin.Host. ...
  • 一、序言 大家或多或少都聽過WebService(Web服務),有一段時間很多電腦期刊、書籍和網站都大肆的提及和宣傳WebService技術,其中不乏很多吹噓和做廣告的成分。但是不得不承認的是WebService真的是一門新興和有前途的技術,那麼WebService到底是什麼?何時應該用? 當前的 ...
  • 出於學習和測試的簡單需要,使用 Console 來作為 EF CORE 的承載程式是最合適不過的。今天筆者就將平時的幾種使用方式總結成文,以供參考,同時也是給本人一個溫故知新的機會。因為沒有一個完整的脈絡,所以也只是想起什麼寫點什麼,不通順的地方還請多多諒解。 本文對象資料庫預設為 VS 自帶的 L ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...