C#中WebBrowser的使用
其實網路上這類文章很多,我大致從頭說說我自己的經驗。
1、加入引用
在控制元件欄按右鍵,選擇“新增/移除項”,選COM元件,選中“Microsoft Web Browser”。然後就可以往窗體上拖出一個該控制元件(下面把該控制元件一個物件稱為webBrowser)。控制元件屬性中可以調整的不多,從一些資料中得知WebBrowser中的MenuBar、StatusBar等其實都沒實現。
2、控制元件的函式
由於是COM過來的控制元件,它的一些函式就比較怪,基本的Navigate函式除了第一個引數外,其它都是ref型別的,需要顯式地寫ref才能呼叫。一般要使之導向到某個頁面,先設定一個空物件,object bjNull=null;然後
webBrowser.Navigate(strPage, ref objNull, ref objNull, ref objNull, ref objNull);
即可。具體其它四個引數可參考相關文件。
還有一個常用的功能,就是怎麼讓瀏覽器顯示自己的html文件,一個方法是用DOM里根元素的innerText:
((mshtml.HTMLDocumentClass)webBrowser.Document).documentElement.innerText=sHTML;
相當用於Javascript設定網頁的程式碼。這種方法方便是方便,但是有很多問題,寫入的大部分Javascript函式都沒法正常使用,即使用似乎也沒用;這樣不能用前進、後退來進行歷史瀏覽;檢視原始碼根本看不到什麼……其實最致命的就是 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" );
暫時就這樣,比較常用的也就是這些了。其它的就讓我們在繼續使用中慢慢琢磨體會吧。
1、加入引用
在控制元件欄按右鍵,選擇“新增/移除項”,選COM元件,選中“Microsoft Web Browser”。然後就可以往窗體上拖出一個該控制元件(下面把該控制元件一個物件稱為webBrowser)。控制元件屬性中可以調整的不多,從一些資料中得知WebBrowser中的MenuBar、StatusBar等其實都沒實現。
2、控制元件的函式
由於是COM過來的控制元件,它的一些函式就比較怪,基本的Navigate函式除了第一個引數外,其它都是ref型別的,需要顯式地寫ref才能呼叫。一般要使之導向到某個頁面,先設定一個空物件,object bjNull=null;然後
webBrowser.Navigate(strPage, ref objNull, ref objNull, ref objNull, ref objNull);
即可。具體其它四個引數可參考相關文件。
還有一個常用的功能,就是怎麼讓瀏覽器顯示自己的html文件,一個方法是用DOM里根元素的innerText:
((mshtml.HTMLDocumentClass)webBrowser.Document).documentElement.innerText=sHTML;
相當用於Javascript設定網頁的程式碼。這種方法方便是方便,但是有很多問題,寫入的大部分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" );
暫時就這樣,比較常用的也就是這些了。其它的就讓我們在繼續使用中慢慢琢磨體會吧。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14766526/viewspace-591135/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在WPF中嵌入WebBrowser視覺化頁面Web視覺化
- 如何使用 C# 中的 ValueTaskC#
- 如何使用 C# 中的 LazyC#
- C#中普通快取的使用C#快取
- WebBrowser採用MVVM繫結的方式更新內容WebMVVM
- C#中的char和string的使用簡介C#
- 【swagger】C# 中 swagger 的使用及避坑SwaggerC#
- Winform獲取並設定WebBrowser所用的IE核心版本ORMWeb
- C#/Vsto中CustomTaskPanes和Ribbon的使用方法C#
- [C#]C#中字串的操作C#字串
- C# ExpandoObject的使用C#Object
- C# RabbitMQ的使用C#MQ
- C#中的MVCC#MVC
- C#中的MVVMC#MVVM
- c#中的事件C#事件
- C#中的集合C#
- C# 9.0中引入的新特性init和record的使用思考C#
- C#分散式專案中是否使用MassTransitC#分散式
- c#中lock的使用(用於預約超出限額的流程)C#
- C#中Enum的用法C#
- 理解C#中的ValueTaskC#
- 理解C#中的ConfigureAwaitC#AI
- C# 中的特性 AttributeC#
- c#中的委託C#
- c#中HttpWebRequest使用Proxy實現指定IP的域名請求C#HTTPWeb
- C# 左移右移在資料型別轉換中的使用C#資料型別
- C#二維陣列在SLG中的實現和使用C#陣列
- C# 遞迴的使用案例C#遞迴
- toLua中Lua呼叫C#中的類C#
- C# 中 10 個你真的應該學習(和使用!)的功能C#
- 使用 CliWrap 讓C#中的命令列互動舉重若輕C#命令列
- C# 使用JavaScript設定或驗證 PDF中的文字域格式C#JavaScript
- C#中URL的操作類C#
- C#中的表示式樹C#
- 理解C#中的閉包C#
- C#中?和??及?:的用法C#
- C#中屬性的解析C#
- C# 中的本地函式C#函式
- C# 提取PDF中的表格C#