2008年6月16日 星期一

[轉貼]C#使用Webbrowser的一點心得體會

C#使用Webbrowser

[轉貼]原文出處: http://www.cnblogs.com/yuanbao/archive/2007/09/12/890730.html



自從用上VS2005後,發現多了個WebBrowser控件(.net 2003中不帶),為圖方便吧,有好多小工具就用這個寫的,慢慢也有點體會了,總結一下,與網友們共享吧。

1
、如何獲得打開網頁出錯信息

DocumentCompleted事件中,判斷Document.Url.AbsoluteUri中的"res://":標誌即可(以前總用e.Url,怪不得總截取不到)

if (webBrowser1.Document.Url.AbsoluteUri.IndexOf("res://") > -1) //
出錯處理

{

webBrowser1.Navigate(e.Url);

return;

}

2
、如何使用IHTMLDocument2MSHTML功能

VS2005
中沒有完全封裝MSHTML中的功能,留了個DomDocument接口。直接引用Microsoft HTML Object Library類庫後,就可以操作IHTMLDocument2等複雜的功能了。如:IHTMLDocument2 doc2 = (IHTMLDocument2)webBrowser1.Document.DomDocument;

3
、如何提取網頁中的圖片,尤其是驗證碼圖等以流方式返回的圖片

很多網站一些圖片是動態生成了,是從服務器以流方式一點點發過來再組裝成圖片的。不管是以什麼方式,到了客戶端,都是完整的。用WebBrowser的好處就在這裡,只要管住最終結果就OK了。以下是得到網頁上驗證碼的代碼:

/// <summary>

///
返回指定WebBrowser中圖片<IMG></IMG>中的圖內容

/// </summary>

/// <param name="WebCtl">WebBrowser
控件</param>

/// <param name="ImgeTag">IMG
元素</param>

/// <returns>IMG
對象</returns>

private Image GetWebImage(WebBrowser WebCtl, HtmlElement ImgeTag)

{

HTMLDocument doc = (HTMLDocument)WebCtl.Document.DomDocument;

HTMLBody body = (HTMLBody)doc.body;

IHTMLControlRange rang = (IHTMLControlRange)body.createControlRange();

IHTMLControlElement Img = (IHTMLControlElement)ImgeTag.DomElement; //
圖片地址

Image oldImage = Clipboard.GetImage();

rang.add(Img);

rang.execCommand("Copy", false, null); //
拷貝到內存

Image numImage = Clipboard.GetImage(); //
Clipboard中取圖

Clipboard.SetImage(oldImage); //
還原

return numImage;

}



4
、如何屏蔽掉Alert()類型的彈出窗口

首先申明這不是技術,只是一種處理的技巧。網上查了很多資料,對於網頁中彈出Alert()窗口不好屏蔽(尤其是Writer出來的)。我的方法是做兩個EXE,一個為主程序.exe,一個Run.exe WebBrowser控件放在RUN.exe中,在主程序中通過Process調用RUN.exe,而用在執行完任務後,將RUN.exe殺掉(Kill),這時Alert窗口會自動關閉。我用這種技巧做了好了個投票機,可以安靜的運行,還能迴避Session處理等問題,也不會在桌面上留下一堆窗口。

2 意見:

張貼留言
Kenny Hsu 提到...

很多字詞似乎都是大陸用語?

匿名 提到...

IHTMLControlRange、IHTMLControlElement、execCommand、
CaptchaCracked
請問一下這類東西用法如何使用、為啥需要使用這些東西??
MSDN為啥找不到??如果要找相關資源用法要去哪找???