📄 webbrowsercontroller.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using APLib.Native;
namespace APLib.Windows.Control
{
/// <summary>
/// 多页面浏览器控制界面类
/// 自定义控件,提供导航按钮,地址栏和代理
/// </summary>
public partial class WebBrowserController : UserControl
{
#region WebProxy
/// <summary>
/// 代理服务器管理类
/// </summary>
public class WebProxy
{
/// <summary>
/// singleton模式
/// </summary>
private static WebProxy instance;
/// <summary>
/// 代理服务器列表
/// </summary>
private List<string> proxyServer;
/// <summary>
/// 代理服务器管理类事件委托
/// </summary>
/// <param name="param">参数</param>
public delegate void ProxyEventHandler(object param);
/// <summary>
/// 添加代理服务器事件
/// </summary>
public event ProxyEventHandler ProxyServerAdded;
/// <summary>
/// 删除代理服务器事件
/// </summary>
public event ProxyEventHandler ProxyServerRemoved;
/// <summary>
/// 代理服务器列表改变事件
/// </summary>
public event ProxyEventHandler ProxyServerChanged;
/// <summary>
/// 代理状态改变事件
/// </summary>
public event ProxyEventHandler ProxyStateChanged;
/// <summary>
/// 构造函数
/// </summary>
private WebProxy()
{
proxyServer = new List<string>();
}
/// <summary>
/// 获取代理管理类实例
/// </summary>
/// <returns>代理管理类对象</returns>
public static WebProxy GetInstance()
{
if (instance == null)
instance = new WebProxy();
return instance;
}
/// <summary>
/// 设置代理服务器
/// </summary>
/// <param name="proxy">IP:PORT</param>
public string ProxyServer
{
get
{
return Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyServer", null) as string;
}
set
{
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyServer", value, RegistryValueKind.String);
FireServerChangedEvent(value);
}
}
/// <summary>
/// 开启或关闭代理
/// </summary>
public bool IsProxyEnabled
{
get
{
return (int)Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0) == 1;
}
set
{
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", value ? 1 : 0, RegistryValueKind.DWord);
ActiveProxy();
if (ProxyStateChanged != null)
ProxyStateChanged(value);
}
}
/// <summary>
/// 通知IE代理服务器或代理状态改变
/// </summary>
public void ActiveProxy()
{
API.InternetSetOption(IntPtr.Zero, InternetOptionFlags.INTERNET_OPTION_SETTINGS_CHANGED, IntPtr.Zero, 0);
}
/// <summary>
/// 添加代理服务器
/// </summary>
/// <param name="proxy">要添加的代理服务器地址</param>
/// <example>218.57.243.51:80</example>
public void AddServer(string proxy)
{
if (!proxyServer.Contains(proxy))
{
proxyServer.Add(proxy);
if (ProxyServerAdded != null)
ProxyServerAdded(proxy);
}
}
/// <summary>
/// 删除代理服务器
/// </summary>
/// <param name="proxy">要删除的代理服务器地址</param>
public void RemoveServer(string proxy)
{
if (proxyServer.Contains(proxy))
{
proxyServer.Remove(proxy);
if (ProxyServerRemoved != null)
ProxyServerRemoved(proxy);
}
}
/// <summary>
/// 获取所有代理服务器地址
/// </summary>
/// <returns>代理服务器地址数组</returns>
public string[] GetAllServer()
{
return proxyServer.ToArray();
}
/// <summary>
/// 调用ProxyServerChanged事件
/// </summary>
/// <param name="server">ProxyServerChanged事件参数</param>
public void FireServerChangedEvent(string server)
{
if (ProxyServerChanged != null)
ProxyServerChanged(server);
}
}
#endregion
/// <summary>
/// 代理状态
/// </summary>
private bool proxyEnabled;
/// <summary>
/// 代理管理器对象
/// </summary>
private WebProxy proxy;
/// <summary>
/// 多页面浏览器对象
/// </summary>
private PagedWebBrowser webBrowser;
/// <summary>
/// 获取代理状态
/// </summary>
public bool ProxyEnable { get { return proxyEnabled; } }
/// <summary>
/// 获取多页面浏览器对象
/// </summary>
public PagedWebBrowser WebBrowser { get { return this.webBrowser; } }
/// <summary>
/// 构造函数
/// </summary>
public WebBrowserController()
{
InitializeComponent();
proxy = WebProxy.GetInstance();
proxy.ProxyServerAdded += new WebProxy.ProxyEventHandler(proxy_ProxyServerAdded);
proxy.ProxyServerRemoved += new WebProxy.ProxyEventHandler(proxy_ProxyServerRemoved);
proxy.ProxyServerChanged += new WebProxy.ProxyEventHandler(proxy_ProxyServerChanged);
proxy.ProxyStateChanged += new WebProxy.ProxyEventHandler(proxy_ProxyStateChanged);
proxyEnabled = proxy.IsProxyEnabled;
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="browser">进行控制的多页面浏览器对象</param>
public WebBrowserController(PagedWebBrowser browser):base()
{
Attach(browser);
}
/// <summary>
/// 设置进行控制的多页面浏览器对象
/// </summary>
/// <param name="browser">多页面浏览器对象</param>
public void Attach(PagedWebBrowser browser)
{
if (webBrowser != null)
{
webBrowser.CanGoBackChanged -= new EventHandler(browser_CanGoBackChanged);
webBrowser.CanGoForwardChanged -= new EventHandler(browser_CanGoForwardChanged);
webBrowser.PageLocationChanged -= new EventHandler(browser_PageLocationChanged);
webBrowser.Dispose();
}
this.webBrowser = browser;
webBrowser.Dock = DockStyle.Fill;
browser.CanGoBackChanged += new EventHandler(browser_CanGoBackChanged);
browser.CanGoForwardChanged += new EventHandler(browser_CanGoForwardChanged);
browser.PageLocationChanged += new EventHandler(browser_PageLocationChanged);
}
/// <summary>
/// 启用所有界面元素
/// </summary>
public void UpdateUI()
{
wtURL.Enabled = true;
if (webBrowser.Web != null)
{
wtBack.Enabled = webBrowser.Web.CanGoBack;
wtForward.Enabled = webBrowser.Web.CanGoForward;
}
wtStop.Enabled = true;
wtRefresh.Enabled = true;
wtProxy.Enabled = true;
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(this.GetType());
if (proxyEnabled)
wtProxy.Image = global::APLib.Windows.Control.Properties.Resource.Proxy;
else
wtProxy.Image = global::APLib.Windows.Control.Properties.Resource.ProxyDisabled;
}
#region WebProxy事件
private void proxy_ProxyStateChanged(object param)
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(this.GetType());
if (proxyEnabled)
wtProxy.Image = global::APLib.Windows.Control.Properties.Resource.Proxy;
else
wtProxy.Image = global::APLib.Windows.Control.Properties.Resource.ProxyDisabled;
}
private void proxy_ProxyServerChanged(object param)
{
string server = param as string;
foreach (ToolStripMenuItem item in menuProxy.Items)
{
if (item.Text == server)
item.Checked = true;
else
item.Checked = false;
}
}
private void proxy_ProxyServerRemoved(object param)
{
ToolStripMenuItem item = menuProxy.Items[param as string] as ToolStripMenuItem;
if (item.Checked)
proxy.IsProxyEnabled = false;
menuProxy.Items.Remove(item);
item.Dispose();
}
private void proxy_ProxyServerAdded(object param)
{
ToolStripItem item = menuProxy.Items.Add(param as string);
item.Name = param as string;
item.DisplayStyle = ToolStripItemDisplayStyle.Text;
}
#endregion
#region PagedWebBrowser事件处理函数
private void browser_CanGoBackChanged(object sender, EventArgs e)
{
WebBrowserEx web = sender as WebBrowserEx;
wtBack.Enabled = web.CanGoBack;
}
private void browser_CanGoForwardChanged(object sender, EventArgs e)
{
WebBrowserEx web = sender as WebBrowserEx;
wtForward.Enabled = web.CanGoForward;
}
private void browser_PageLocationChanged(object sender, EventArgs e)
{
WebBrowserEx web = sender as WebBrowserEx;
if (web.Url != null)
wtURL.Text = web.Url.ToString();
}
#endregion
#region ToolStrip事件
private void wtURL_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)
{
if (webBrowser.TabPages.Count == 0)
webBrowser.CreateNewPage(wtURL.Text, true);
else
webBrowser.Open(wtURL.Text);
e.Handled = true;
}
}
private void wtURL_MouseEnter(object sender, EventArgs e)
{
wtURL.Focus();
wtURL.SelectAll();
}
private void wtRefresh_Click(object sender, EventArgs e)
{
WebBrowserEx web = webBrowser.Web;
if (web != null)
web.Refresh(WebBrowserRefreshOption.Completely);
}
private void wtNew_Click(object sender, EventArgs e)
{
webBrowser.CreateNewPage(null, true);
}
private void wtStop_Click(object sender, EventArgs e)
{
WebBrowserEx web = webBrowser.Web;
if (web != null)
web.Stop();
}
private void wtBack_Click(object sender, EventArgs e)
{
WebBrowserEx web = webBrowser.Web;
if (web != null)
web.GoBack();
}
private void wtForward_Click(object sender, EventArgs e)
{
WebBrowserEx web = webBrowser.Web;
if (web != null)
web.GoForward();
}
private void wtGohome_Click(object sender, EventArgs e)
{
if (webBrowser.Web == null)
WebBrowser.CreateNewPage(null, true);
webBrowser.Web.GoHome();
}
private void wtProxy_Click(object sender, EventArgs e)
{
proxyEnabled = !proxyEnabled;
proxy.IsProxyEnabled = proxyEnabled;
}
private void wtProxy_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
menuProxy.Show(webTool.PointToScreen(new Point(e.X + webTool.Width - wtProxy.Width, e.Y)));
}
}
private void webTool_SizeChanged(object sender, EventArgs e)
{
int width = 0;
foreach (ToolStripItem item in webTool.Items)
width += item.Width;
width -= wtURL.Width;
wtURL.Width = webTool.Width - width - 20;
}
#endregion
#region menuProxy事件
private void editProxyList_Click(object sender, EventArgs e)
{
ProxyServerManagement dlg = new ProxyServerManagement();
dlg.ShowDialog();
}
private void menuProxy_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
ToolStripMenuItem item=e.ClickedItem as ToolStripMenuItem;
if (item != editProxyList)
{
foreach (ToolStripMenuItem i in menuProxy.Items)
i.Checked = false;
item.Checked = true;
proxy.ProxyServer = e.ClickedItem.Text;
}
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -