C#中WebBrowser的使用

來源:互聯網
上載者:User

  其實網路上這類文章很多,我大致從頭說說我自己的經驗。
1、加入引用
  在控制項欄按右鍵,選擇“添加/移除項”,選COM組件,選中“Microsoft Web Browser”。然後就可以往表單上拖出一個該控制項(下面把該控制項一個對象稱為webBrowser)。控制項屬性中可以調整的不多,從一些資料中得知WebBrowser中的MenuBar、StatusBar等其實都沒實現。
(注: .Net 2.0已經專門封裝了一個控制項,不需要添加COM組件了。)
2、控制項的函數
  由於是COM過來的控制項,它的一些函數就比較怪,基本的Navigate函數除了第一個參數外,其它都是ref類型的,需要顯式地寫ref才能調用。一般要使之導向到某個頁面,先設定一個Null 物件,object objNull=null;然後
webBrowser.Navigate(strPage, ref objNull, ref objNull, ref objNull, ref objNull);
即可。具體其它四個參數可參考相關文檔。
  還有一個常用的功能,就是怎麼讓瀏覽器顯示自己的html文檔,一個方法是用DOM雷根元素的innerText:
  ((mshtml.HTMLDocumentClass)webBrowser.Document).documentElement.innerText=sHTML;

(注: 以上是.Net 1.1下的代碼)
  相當用於Javascript設定網頁的代碼。這種方法方便是方便,但是有很多問題,寫入的大部分Javascript函數都沒法正常使用,即使用<script defer>似乎也沒用;這樣不能用前進、後退來進行曆史瀏覽;查看原始碼根本看不到什麼……其實最致命的就是 Javascript沒法用,無法滿足一般的需要。
  第二個方法是把自己的網頁寫到一個臨時檔案,然後navigate到這個檔案,Foxmail是這樣做的。這樣做的缺點是會產生很多臨時檔案,檔案在磁碟上的讀寫需要耗費較多時間,而且要記得及時清理。
  第三個方法是用COM中IPersistStreamInit之類的,使用流操作,據說Outlook便是這樣做的。這樣顯然是最好的,在記憶體中形成網頁進行操作速度也很快。但我在.Net裡找不到這個介面,所以不知道如何?。

3、與應用程式互動
  網頁與應用程式的互動不外乎是網頁上點擊某連結,或通過其它途徑,比如表單提交等,使瀏覽器導航至新的連結,所以我通過BeforeNavigate2這個事件來,該事件有flags、headers、postData、targetFrameName、uRL等屬性,足夠我們進行處理。這樣我們程式就好像一個WebServer,可以處理網頁上的連結、提交的表單等等。然後把使瀏覽器導航至處理後產生的結果網頁。
  又在網上看到有人用System.Runtime.InteropServices.Expando.IExpando:
  mshtml.HTMLDocumentClass doc2=(mshtml.HTMLDocumentClass)webBrowser.Document;
  System.Runtime.InteropServices.Expando.IExpando ex=(System.Runtime.InteropServices.Expando.IExpando)doc2;
  System.Reflection.PropertyInfo piform1=ex.AddProperty("Form1");
  piform1.SetValue(doc2,this,null);
  這樣,在網頁中的document.Form1就是這個WinForm的Control了。你可以用指令碼來調用Form1!這也不失為一個極妙的方法。

4、應用程式操作瀏覽器/網頁:
  WebBrowser瀏覽器控制項提供了一些函數,如ExecWB,可以使瀏覽器執行內部定義的一些操作,如執行另存新檔:
  webBrowser.ExecWB( SHDocVw.OLECMDID.OLECMDID_SAVEAS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref objNull, ref objNull );
  但似乎這裡按取消的話會拋出一個異常,所以我用一個空的try{}catch(Exception){}來捕獲它,就不會有錯誤了。
  還可以用DOM裡的一些方法來操作網頁,舉個例子,可以這樣調用網頁中寫好的一個Javascript函數func():
  ((mshtml.HTMLDocumentClass)webBrowser.Document).parentWindow.execScript( "func()", "JScript" );
(注: 同樣是.Net 1.1的代碼)
暫時就這樣,比較常用的也就是這些了。其它的就讓我們在繼續使用中慢慢琢磨體會吧。
(注: 發現這篇文章被很多地方轉錄了,說明一下,只適用於.Net 1.1)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.