-----------------------------------------
/// <summary>
/// 調用前端的靜態頁面的類 (調用ie的內核)
/// </summary>
public class FinalHtml
{
private String htmlString;
private String url;
private String htmlTitle;
// 獲得html title標簽的內容
public String HtmlTitle
{
get
{
if (success == false) return null;
return htmlTitle;
}
}
private List<string> linkList;
private List<string> imageList;
private bool success; // 是否成功運行
///
/// 獲得網頁所有鏈接的鏈表, 一定要在Run之后進行
///
public List<string> LinkList
{
get
{
if (success == false) return null;
return linkList;
}
}
///
/// 獲得所有圖像的標簽, 一定要在Run之后進行
///
public List<string> ImageList
{
get
{
if (success == false) return null;
return imageList;
}
}
///
/// 獲得執行完js之后的網頁body 部分的html代碼
///
public String HtmlBody
{
get
{
if (success == false) return null;
return htmlString;
}
}
public FinalHtml()
{
linkList = new List<string>();
imageList = new List<string>();
htmlString = "";
success = false;
}
///
/// 檢查並補充設置url
///
///
private void CheckURL(String url)
{
if (!url.StartsWith("http://") && !url.StartsWith("https://") && !url.StartsWith("file:///"))
url = "http://" + url;
this.url = url;
}
///
/// 加載指定文件
///
/// 文件URL
/// 超時時限
/// 是否成功運行,沒有超時
public bool Run(String url, int timeOut = 10000)
{
CheckURL(url);
Thread newThread = new Thread(NewThread);
newThread.SetApartmentState(ApartmentState.STA);/// 為了創建WebBrowser類的實例 必須將對應線程設為單線程單元
newThread.Start();
//監督子線程運行時間
while (newThread.IsAlive && timeOut > 0)
{
Thread.Sleep(100);
timeOut -= 100;
}
// 超時處理
if (newThread.IsAlive)
{
if (success) return true;
newThread.Abort();
return false;
}
return true;
}
private void NewThread()
{
new FinalHtmlPerThread(this);
Application.Run();// 循環等待webBrowser 加載完畢 調用 DocumentCompleted 事件
}
///
/// 用於處理一個url的核心類
///
class FinalHtmlPerThread : IDisposable
{
FinalHtml master;
WebBrowser web;
public FinalHtmlPerThread(FinalHtml master)
{
this.master = master;
DealWithUrl();
}
private void DealWithUrl()
{
String url = master.url;
web = new WebBrowser();
bool success = false;
try
{
web.Url = new Uri(url);
web.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(web_DocumentCompleted); // 對事件加委托
success = true;
}
finally
{
if (!success)
Dispose();
}
}
public void Dispose()
{
if (!web.IsDisposed)
web.Dispose();
}
private void ToList(HtmlElementCollection collection, List<string> list)
{
System.Collections.IEnumerator it = collection.GetEnumerator();
while (it.MoveNext())
{
HtmlElement htmlElement = (HtmlElement)it.Current;
list.Add(htmlElement.OuterHtml);
}
}
private void web_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//微軟官方回答一個網頁有多個Ifram元素就有可能觸發多次此事件, 並且提到了
// vb 和 C++ 的解決方案, C# 沒有提及,經本人嘗試,發現下面的語句可以判斷成功
// 如果未完全加載 web.ReadyState = WebBrowserReadyState.Interactive
if (web.ReadyState != WebBrowserReadyState.Complete) return;
master.htmlTitle = web.Document.Title;
ToList(web.Document.Links, master.linkList);
ToList(web.Document.Images, master.imageList);
master.htmlString = web.Document.Body.InnerHtml;
master.success = true;
Thread.CurrentThread.Abort();
}
}
}
-----------調用---------------
//用IE執行運行相應的連接
StringBuilder sb = new StringBuilder();
try
{
FinalHtml html = new FinalHtml();
//打開的連接。
if (html.Run("http://192.168.0.145:8080/webPhone/test_canvas/1.html"))
{
}
}
catch (Exception ex)
{
throw;
}
------------------------------------
var d = Process.Start(@"D:\安裝軟件\Mozilla Firefox\firefox.exe", "http://192.168.0.145:8080/webPhone/test_canvas/1.html");//本地的火狐瀏覽器
---------------------------------------關閉進程----
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcessesByName("firefox"))
{
p.Kill();
}