[C#]製作專屬的 WebBrowser 瀏覽器

雖然現在的瀏覽器已經有很多種不同的系統,但若能開發一個量身訂做的瀏覽器時,在操作使用上會更得心應手吧!加上筆者最近寫了「開心農場瀏覽器」,因此就有些網友來信問說如何寫類似的程式。但是要從無到有開發出一個瀏覽器並不是簡單的事,不過若使用 .NET 內建的 WebBrowser 元件的話,保障在開發上能事半功倍。

一樣是先快速的把畫面排出來,這邊使用到 5 個 Button(按鈕) 來當做執行上一頁、下一頁、重新整理、停止及首頁用,接著再放上 Label(標籤)TextBox(文字輸入框)Button(按鈕) 用來讓使用者輸入網址後並前往用,當然最重要的 WebBrowser(瀏覽器) 可別忘記要一起放在 Form(表單) 上喔。

dotnet_webbrowser_1

在放置 WebBrowser(瀏覽器) 的時候要注意一下,它的 Dock 屬性預設是 Fill,它可會是佔滿整個 Form(表單) 的,因此先把它設成 None 後再來手動調整大小及位置。畫面都排版好之後,就讓我們開始來 DIY 專屬瀏覽器囉。

首先當 WebBrowser(瀏覽器) 執行時,筆者希望預設能連到某網址,所以就咱們就要在 Form(表單) 載入時來做設定:

1
2
3
4
private void Form1_Load(object sender, EventArgs e) {
	// 預設載入的頁面
	webBrowser1.Navigate("http://abgne.tw");
}

要讓 WebBrowser(瀏覽器) 連到某網址時可以用 Navigate(網址) 來執行動作。

接下來讓我們一口氣來完成上一頁、下一頁、重新整理、停止及首頁等功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private void backBtn_Click(object sender, EventArgs e) {
	// 上一頁
	webBrowser1.GoBack();
}
 
private void forwardBtn_Click(object sender, EventArgs e) {
	// 下一頁
	webBrowser1.GoForward();
}
 
private void refreshBtn_Click(object sender, EventArgs e) {
	// 重新整理
	webBrowser1.Refresh();
}
 
private void stopBtn_Click(object sender, EventArgs e) {
	// 停止
	webBrowser1.Stop();
}
 
private void homeBtn_Click(object sender, EventArgs e) {
	// 首頁
	webBrowser1.GoHome();
}

透過 WebBrowser(瀏覽器) 內建方法就能輕鬆達到各種指令,像是回首頁也只是 GoHome() 就可以囉。但我們所使用的是 .NET 所提供的元件,因此這邊的首頁設定就是跟 IE 瀏覽器一樣的

完成以上動作之後,再來要做的就是輸入要瀏覽的網址後並前往:

1
2
3
4
5
6
7
8
9
10
11
private void goBtn_Click(object sender, EventArgs e) {
	// 前往網址輸入框中的網址
	webBrowser1.Navigate(textBox1.Text);
}
 
private void textBox1_KeyUp(object sender, KeyEventArgs e) {
	// 如果在網址輸入框中按下 Enter 則前往網址輸入框中的網址
	if(e.KeyCode == Keys.Enter) {
		webBrowser1.Navigate(textBox1.Text);
	}
}

當按下前往的 Button(按鈕) 後就能使用 Navigate(網址) 來連到輸入框中所輸入的網址;除了透過按鈕前往之外,使用者也可能直接輸入完網址後就直接按下 Enter 鈕,所以筆者也針對輸入框的 KeyUP 事件加上 Enter 鈕的判斷。

目前寫到這邊已經算是完成一個簡單且基本的瀏覽器了,但不知道各位有沒有注意到當我們瀏覽到不同網頁時,我們的輸入框中的網址並沒有跟著改變呢?!筆者希望當網頁改變並載入完後就顯示新的網址,所以我們得在 WebBrowser(瀏覽器)DocumentCompleted 事件上加入指定的程式:

1
2
3
4
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
	// 把目前的網址顯示在網址輸入框中
	textBox1.Text = webBrowser1.Url.ToString();
}

現在整個完成後,就是一個較完整的瀏覽器囉~

dotnet_webbrowser_2

如果還要能控制網頁或是做一些能自動控制功能的話,當然得再這基礎上加上更多的程式功能才行。接下來會用實際的網頁範例來實做出來。

範例下載:WebBrowserExample.rar

相關連結
推薦內容
發表留言

如果有任何 jQuery 問題也可以直接到 討論區 中發文討論。
  1. 收藏
    2009-11-28 21:55:08 回覆

    真酷..
    我也想試看看
    但是學校只有交 VB2008
    也只有VB2008 可以玩..
    還要考FOR NEXT的迴圈...
    很複雜@@..


    • 男丁格爾
      男丁格爾
      2009-11-28 21:57:05 回覆

      其實 VB.NET 跟 C# 只是差在一些寫法不同而已,這些元件內建的方法都是一樣的,你參考看看並試著動手改一改。
      若有問題可以提出來討論~~


  2. 收藏
    2009-11-28 22:32:28 回覆

    嗯嗯..
    真的都差不多..
    我用出來了
    只是有一點小LAG
    載入網頁 按鈕就不能用=.=


  3. 聽。風
    2009-11-29 07:21:01 回覆

    用webBrowse做出來的幾乎不能算是自己的瀏覽器了
    因為webBrowse控制項是直接用IE的核心
    建議想學寫瀏覽器人可以參考Firefox的原始碼


    • 男丁格爾
      男丁格爾
      2009-11-29 11:33:49 回覆

      嗯嗯~~一開始就有提到要從無到有寫出一個瀏覽器並不是一件簡單的事
      若使用 WebBrowser 則是能節省很多時間的....

      另外,所謂的專屬瀏覽器並不一定是要一個跟現有的核心有所不同
      也許是有自己需要的功能等等..


  4. 收藏
    2009-11-29 08:44:40 回覆

    問一下哦~
    妳那開心農場畫面怎變大的?


    • 男丁格爾
      男丁格爾
      2009-11-29 11:32:04 回覆

      方法很多種...其實一種比較簡單的是先取得其網頁內容後再輸出


  5. Mido
    2009-11-30 03:23:25 回覆

    哇!好棒喔~
    我的VB不知道哪時候做得出來XD


    • 男丁格爾
      男丁格爾
      2009-11-30 09:52:03 回覆

      VB 的用法其實也差不多耶...因為這是基本的@@


  6. 米奇
    2009-11-30 21:36:04 回覆

    針對製作這個 需要具備哪個 軟體來執行了
    我還是新手不是很懂 希望能有大大教學一下


    • 男丁格爾
      男丁格爾
      2009-11-30 22:40:12 回覆

      軟體嗎..?你可以到微軟下載免費版的 Visual Studio Express 版來玩看看..
      或是一樣是免費的 SharpDevelop


  7. 米奇
    2009-11-30 21:37:00 回覆

    這個 不同電腦 不同螢幕 用出來的大小 都是固定的嗎?
    跟電腦解析度有關西嗎?


    • 男丁格爾
      男丁格爾
      2009-11-30 22:38:50 回覆

      你要問的是什麼大小呢...?


  8. SoHo
    2009-12-01 16:25:02 回覆

    您好!! 男丁格爾

    想請教您 , 如果取得其網頁內容後再輸出後 , Flash部分要如何做處理 , 可讓畫面拉到最大 ?


    • 男丁格爾
      男丁格爾
      2009-12-01 17:27:34 回覆

      輸出時應該就能改變 flash 的寬跟高了..
      但雖然能把 swf 整個變大...但遊戲畫面是否能跟著變大就要看設計者的設定了


  9. 學習C#
    2009-12-14 17:21:13 回覆

    以開心農場為例,想請教您,如果已取得WebBrowser物件內Flash部份的Handle,可以透過指令使Flash Fit WebBrowser物件的大小嗎?


    • 男丁格爾
      男丁格爾
      2009-12-14 22:21:37 回覆

      我是從網頁原始碼下手的~


  10. XD
    2009-12-15 17:14:09 回覆

    您好.我的問題可能有點複雜請耐心看一下...
    請問我是新手目前還在自學C#..我用winfrom做了一個查詢的程式有Form1,Form2在Form1裡面有textbox.richtextbox做一個查詢按下Button以後送出查詢,在richtextbox顯示。這部分都沒有問題,但是後來我增加了combobox.想做成條件篩選我不太懂switch..case.裡面該怎麼設定會我在[設計畫面]點選combobox編輯項目裡面增加了=.%LIKE.LIKE%.%LIKE%我想要做到條件=的時候直接在Form1的richtextbox顯示相關訊息,條件是%LIKE或LIKE%,%LIKE%的時候按下Button跳出From2,From2裡面只有一個DataGridView將相關的資料顯示出來,我比較有問題的地方是Switch..case這部分我的程式碼

    private void btnSelect_Click(object sender, EventArgs e)
    {
    using (SqlConnection cn = new SqlConnection())
    {
    int index; //問題點
    index = cob.SelectedIndex.ToString; //問題點
    string searchName = txtName.Text;
    switch (index)
    {
    case "0": //問題點
    string selectCmd = "SELECT * FROM [TEST].[dbo].[INVMB] MB001 ='" + searchName + "'";
    SqlCommand cmd = new SqlCommand(selectCmd, cn);
    SqlDataReader dr = cmd.ExecuteReader();
    if (dr.Read())
    {
    rtbShow.Text="品號:" +"\t"+dr["MB001"]+"\n";
    rtbShow.Text+="品名"+ "\t"+dr["MB002"]+"\n";
    .
    .
    }else{
    rtbShow.Text="找不到這個資料!";
    }
    break;
    case "1":
    ...//如何開啟From2
    ..
    break;

    我按下F5以後就會出現下面的錯誤訊息
    無法將型別stringu隱含轉換成int

    一只搞不懂哪裡錯了...
    問題1.我index宣告成string也過不了char也過不了需要宣告成什麼?
    問題2....switch...case...在case "":<=這裡因該要填寫0.1.2.3還是都可以自己設定?
    問題3.如果我下拉式選單選到%LIKE.LIKE%.%LIKE%時如何跳出From2在DataGirdView顯示?
    非常感謝~~~~如有刁擾之處請見諒


    • 男丁格爾
      男丁格爾
      2009-12-15 17:27:51 回覆

      先一個一個來...你index宣告成int...那你在下一行接到的是string...
      看是要把string先轉成int或是直接用string
      另外,ToString是不是要加個()呢..:D


  11. XD
    2009-12-15 22:53:38 回覆

    不太懂呢:D
    index已經是int了,下一行接的是string這句是甚麼意思?可以寫給我看看嗎?int index=index.ToString();這樣嗎?轉換部分我還是不太懂甚麼可以轉甚麼...還在K書中0.,0"


  12. 粉呆
    2009-12-28 10:27:11 回覆

    男丁大大你好^^
    請問大大本身從事的是哪一類的工作?
    希望有這榮幸能與大大成為朋友,在程式設計領域互相交流。
    小弟本身對flash程式比較了解、VB略懂,我有一種創業構想,這構想也許有機會股票上市,但是要結合你在程式設計上的專業領域,就是要找像你這種人才來合作啦^^
    我住南部,南部這邊開店成本不像北部那般高,資金和人事方面我都有,現在缺像你這種人才,還有現在經濟不景氣,開店需要一個可以想不開的勇氣~~
    我這種構想如果從我這邊(南部)開始做起,一直拓展到你們北部那邊我想是可以很成功的^^
    詳細內容請大大私聊,這算商業機密了。


    • 男丁格爾
      男丁格爾
      2009-12-28 11:38:43 回覆

      本身工作是寫 Web 程式的..
      若有任何問題或建議都很歡迎透過 Mail 來討論研究。


  13. 粉呆
    2009-12-28 12:05:07 回覆

    請男丁大大給我你的信箱,我找不到你的信箱帳號@@


    • 男丁格爾
      男丁格爾
      2009-12-28 12:32:09 回覆

      仔細看留言區塊的上方就有一個關於作者的區塊..那邊就有 Mail 資訊了


  14. jjj811208
    2010-01-16 04:09:50 回覆

    痾.....請問可以拜託大大 幫我用一下開心寶貝的瀏覽器嘛

    http://apps.facebook.com/happy_baby/

    我看完大大的文章還是不會用


    • 男丁格爾
      男丁格爾
      2010-01-16 08:06:12 回覆

      要找時間試試才行@@


  15. 火炎焱燚
    2010-01-22 21:26:30 回覆

    大大,我還是不懂拉,到底開心農場怎麼變大的?可不可以教一下!!!


    • 男丁格爾
      男丁格爾
      2010-01-22 23:09:19 回覆

      過幾天有空再寫進階的教學XD


  16. Lay
    2010-01-23 08:54:53 回覆

    請問要用啥程式編輯???
    我有點霧煞煞= =


    • 男丁格爾
      男丁格爾
      2010-01-23 09:50:48 回覆

      通常都是用 Visual Studio 啦!!


  17. 火炎焱燚
    2010-01-23 16:27:24 回覆

    過幾天有空再寫進階的教學XD
    我很期待喔!加油!!


  18. 咕咕雞
    2010-02-07 11:33:14 回覆

    男丁大您好,我已經利用VB寫好了一個簡易的瀏覽器。

    想要繼續來學習如何控制網頁,我已經可以成功的讓程式自動登入YAHOO的帳號。

    想請問男丁大,如果我要讓程式判斷,某一個網頁原始碼內的"ID",的值"Value"

    或者判斷其他的東西。

    只能先讓程式讀取網頁的原始碼,再做文字的搜尋嗎?

    還是有其他的方法呢?

    (我可能說的很模糊,請男丁大見諒,因為我沒有任何底子,都從網路上爬文和自己摸索的~)

    謝謝^0^


    • 男丁格爾
      男丁格爾
      2010-02-07 12:26:10 回覆

      你要利用 document.getElementById(id) 的方式來取得指定 id 的元素後..
      再取其值來做你要的判斷動作


  19. 咕咕雞
    2010-02-09 18:14:39 回覆

    男丁大您好~
    小弟已經學會了利用WebBrowser.Document來讀取網頁的值,控制網頁的動作~
    想進一步學習,如何讀取開心農場那種Flash遊戲的數據、並且控制它。
    希望您能指點,謝謝^^a


    • 男丁格爾
      男丁格爾
      2010-02-09 18:46:53 回覆

      要等我有時間才能寫更進階的範例教學XD...
      年底有太多 Case 要完成...

      另外..其實我只是控制滑鼠去點擊該點的座標而已..


  20. user
    2010-03-22 09:55:25 回覆

    想請教男大為何使用你的HTML Viewer可以使用IE的附加元件(類似ContexMenuStrip動作),但直接使用webBrowser1卻無法啟動IE的附加元件,請教男大是如何處理的呢?或是有何秘訣

    舉例說明:譬如在IE中對圖片按右鍵後-另存圖片(S)會出現儲存圖片對話框並存圖。但用webBrowser對圖片按右鍵會無任何反應。更進一步的若是網頁有使用到附加元件ActiveXObject的呢?


  21. 帥哥神仙
    2010-08-03 16:43:17 回覆

    請問怎麼把遊戲輸出??才能開啟來只有遊戲沒廣告??


    • 男丁格爾
      男丁格爾
      2010-08-04 11:22:40 回覆

      一種是抓出 swf 路徑來控制.


  22. ids93216
    2010-08-22 13:23:59 回覆

    請問C#是什麼,要用什麼軟體開


    • 男丁格爾
      男丁格爾
      2010-08-22 19:21:44 回覆

      通常是用 Visual Studio


  23. 帥哥神仙
    2010-08-25 20:55:16 回覆

    網頁遊戲swf檔很多怎去抓出來??


    • 男丁格爾
      男丁格爾
      2010-08-26 08:55:15 回覆

      你得從它的網頁原始碼中去解出 swf 的路徑