C#.WinForm 多页签浏览器
最近在做web页面内容解析的工作,为了方便需要开发一个窗体程序,用于实现页面内容提取,采用的是C#下的winform和webBrowser技术。
网上查了一堆资料,很烦,大多写的语焉不详,要么就是资料很老了,发布的示例源代码写的跟鬼一样居然还要几十的下载分,一怒之下自己写了一个,实现的效果包括:
(1)多tab标签页的浏览器模式;
(2)页面内链接的新标签页打开;
(3)页内跳转;
供有需要的参考。比较仓促,可能花点精力细节处会处理的更好;大家简单看看吧。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MultipleWebBrowser
{
public partial class Form1 : Form
{
const int CLOSE_SIZE = 8;
//tabPage标签图片
Bitmap image = new Bitmap(System.Threading.Thread.GetDomain().BaseDirectory+ "delete.gif");
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 公用地址URL
/// </summary>
public string CommonUrl = "";
private void button1_Click(object sender, EventArgs e)
{
if (!string.IsNullOrWhiteSpace(txtUrl.Text.Trim()))
{
webRequest();
}
}
/// <summary>
/// 处理访问网址事件
/// </summary>
private void webRequest()
{
bool existweb = false;
WebBrowser webBrowser = new WebBrowser();
//判断当前tabpage中是否包含webbrowrse控件
if (tabControl1.TabPages.Count > 0 && tabControl1.TabPages[tabControl1.SelectedIndex] != null)
{
foreach (Control controlObject in tabControl1.TabPages[tabControl1.SelectedIndex].Controls)
{
if (controlObject is WebBrowser browser) //判断是否是WebBrowser控件
{
existweb = true;
webBrowser = browser;
}
}
if (existweb)
{
webBrowser.Navigate(txtUrl.Text.Trim());
}
else
{
string host = GetDomain(txtUrl.Text.Trim());
webBrowser.Dock = DockStyle.Fill;
webBrowser.ScriptErrorsSuppressed = true;
webBrowser.AllowWebBrowserDrop = false;
webBrowser.NewWindow += new CancelEventHandler(webBrowser_NewWindow);
webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
webBrowser.Navigated += new WebBrowserNavigatedEventHandler(webBrowser_Navigated);
webBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
webBrowser.Navigate(txtUrl.Text.Trim());
webBrowser.Parent = tabPage1;
tabPage1.Controls.Add(webBrowser);
tabPage1.Text = host;
webBrowser.Show();
}
}
else
{
TabPage tabPage = new TabPage();
tabControl1.TabPages.Add(tabPage);
string host = GetDomain(txtUrl.Text.Trim());
webBrowser.Dock = DockStyle.Fill;
webBrowser.ScriptErrorsSuppressed = true;
webBrowser.AllowWebBrowserDrop = false;
webBrowser.NewWindow += new CancelEventHandler(webBrowser_NewWindow);
webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
webBrowser.Navigated += new WebBrowserNavigatedEventHandler(webBrowser_Navigated);
webBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
webBrowser.Navigate(txtUrl.Text.Trim());
webBrowser.Parent = tabPage1;
tabPage.Controls.Add(webBrowser);
tabPage.Text = host;
webBrowser.Show();
}
}
/// <summary>
/// 通过网址得到域名
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private string GetDomain(string url)
{
string host;
Uri uri;
try
{
uri = new Uri(url);
host = uri.Host + " ";
}
catch
{
return "";
}
string[] BeReplacedStrs = new string[] { ".com.cn", ".edu.cn", ".net.cn", ".org.cn", ".co.jp", ".gov.cn", ".co.uk", "ac.cn", ".edu", ".tv", ".info", ".com", ".ac", ".ag", ".am", ".at", ".be", ".biz", ".bz", ".cc", ".cn", ".com", ".de", ".es", ".eu", ".fm", ".gs", ".hk", ".in", ".info", ".io", ".it", ".jp", ".la", ".md", ".ms", ".name", ".net", ".nl", ".nu", ".org", ".pl", ".ru", ".sc", ".se", ".sg", ".sh", ".tc", ".tk", ".tv", ".tw", ".us", ".co", ".uk", ".vc", ".vg", ".ws", ".il", ".li", ".nz" };
foreach (string oneBeReplacedStr in BeReplacedStrs)
{
string BeReplacedStr = oneBeReplacedStr + " ";
if (host.IndexOf(BeReplacedStr) != -1)
{
host = host.Replace(BeReplacedStr, string.Empty);
break;
}
}
int dotIndex = host.LastIndexOf(".");
host = uri.Host.Substring(dotIndex + 1);
return host;
}
private void Form1_Load(object sender, EventArgs e)
{
btnBack.Enabled = false;
btnForward.Enabled = false;
//设置关闭按钮
this.tabControl1.DrawMode = TabDrawMode.OwnerDrawFixed;
this.tabControl1.Padding = new System.Drawing.Point(CLOSE_SIZE, CLOSE_SIZE);
this.tabControl1.DrawItem += new DrawItemEventHandler(this.MainTabControlClose_DrawItem);
this.tabControl1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MainTabControlClose_MouseDown);
}
public void webBrowser_NewWindow(object sender, CancelEventArgs e)
{
if (((Control)sender) is WebBrowser)
{
var webBrowser = (WebBrowser)sender;
if (!string.IsNullOrWhiteSpace(webBrowser.StatusText))
{
e.Cancel = true;
webBrowser.Dock = DockStyle.Fill;
webBrowser.ScriptErrorsSuppressed = true;
webBrowser.AllowWebBrowserDrop = false;
webBrowser.Navigate(webBrowser.StatusText);
webBrowser.NewWindow += new CancelEventHandler(webBrowser_NewWindow);
webBrowser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser_DocumentCompleted);
webBrowser.Navigated += new WebBrowserNavigatedEventHandler(webBrowser_Navigated);
webBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
string title = GetDomain(webBrowser.StatusText);
TabPage tabPage = new TabPage(title);
webBrowser.Parent = tabPage;
tabPage.Controls.Add(webBrowser);
tabControl1.TabPages.Add(tabPage);
tabPage.Text = title;
tabControl1.SelectedTab=tabPage;
webBrowser.Show();
}
}
}
private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if ((Control)sender is WebBrowser)
{
var webBrowser = (WebBrowser)sender;
string title = (string.IsNullOrWhiteSpace(webBrowser.DocumentTitle)) ? webBrowser.Url.Host : webBrowser.DocumentTitle;
webBrowser.Parent.Text = title;
txtUrl.Text = webBrowser.Url.ToString();
}
}
private void webBrowser_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
if ((Control)sender is WebBrowser)
{
var webBrowser = (WebBrowser)sender;
string title = (string.IsNullOrWhiteSpace(webBrowser.DocumentTitle)) ? webBrowser.Url.Host : webBrowser.DocumentTitle;
webBrowser.Parent.Text = title;
btnBack.Enabled = webBrowser.CanGoBack;
btnForward.Enabled = webBrowser.CanGoForward;
}
}
private void webBrowser_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
{
if ((Control)sender is WebBrowser)
{
var webBrowser = (WebBrowser)sender;
toolStripLabel1.Text = webBrowser.StatusText;
}
}
private void txtUrl_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyData == Keys.Enter && !string.IsNullOrWhiteSpace(txtUrl.Text.Trim()))
{
webRequest();
}
}
//关闭按钮功能
private void MainTabControlClose_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
for (int i = 0; i < this.tabControl1.TabPages.Count; i++)
{
Rectangle r = tabControl1.GetTabRect(i);
//Getting the position of the "x" mark.
Rectangle closeButton = new Rectangle(r.Right - 15, r.Top + 4, 9, 7);
if (closeButton.Contains(e.Location))
{
this.tabControl1.TabPages.RemoveAt(i);
break;
}
}
}
}
}
}
public class WebBrowserTag
{
public int _TabIndex = 0;
public bool _CanBack = false;
public bool _CanForward = false;
}