📄 webbrowserex.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Security.Permissions;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using APLib.Native;
namespace APLib.Windows.Control
{
/// <summary>
/// 浏览器控件类
/// 继承自WebBrowser
/// </summary>
public class WebBrowserEx : WebBrowser
{
/// <summary>
/// 字体缩放值枚举
/// </summary>
public enum ZoomLevel
{
Smallest = 0,
Small = 1,
Middle = 2,
Larger = 3,
Largest = 4
}
/// <summary>
/// 下载项目字节数
/// </summary>
private long totalSize;
/// <summary>
/// 已经下载字节数
/// </summary>
private long downloadSize;
#region 属性
/// <summary>
/// 获取下载项目字节数
/// </summary>
public long TotalSize { get { return totalSize; } }
/// <summary>
/// 获取已经下载字节数
/// </summary>
public long DownloadSize { get { return downloadSize; } }
/// <summary>
/// IWebBrowser2接口对象,参见MSDN
/// </summary>
protected IWebBrowser2 webBroswer2;
/// <summary>
/// Application对象,参见MSDN
/// </summary>
public object Application { get { return webBroswer2.Application; } }
#endregion
#region 事件
/// <summary>
/// 开始下载事件
/// </summary>
public event EventHandler Downloading;
/// <summary>
/// 下载完成事件
/// </summary>
public event EventHandler DownloadComplete;
/// <summary>
/// 开始跳转到网址事件
/// </summary>
public event EventHandler<WebBrowserExNavigatingEventArgs> Navigating2;
/// <summary>
/// 打开新窗口事件
/// </summary>
public event EventHandler<WebBrowserExNavigatingEventArgs> NewWindow2;
/// <summary>
/// 关闭窗口事件
/// </summary>
public event EventHandler Quit;
/// <summary>
/// 标题改变事件
/// </summary>
public event EventHandler TitleChanged;
/// <summary>
/// 字体缩放事件
/// </summary>
public event EventHandler ZoomLevelChanged;
#endregion
/// <summary>
/// 参见AxHost
/// </summary>
protected System.Windows.Forms.AxHost.ConnectionPointCookie cookie;
/// <summary>
/// 参见AxHost
/// </summary>
protected WebBrowserExtendedEvents events;
/// <summary>
/// 重载AttachInterfaces,获取IWebBrowser2接口对象
/// </summary>
/// <param name="nativeActiveXObject">ActiveX对象</param>
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void AttachInterfaces(object nativeActiveXObject)
{
webBroswer2 = (IWebBrowser2)nativeActiveXObject;
base.AttachInterfaces(nativeActiveXObject);
}
/// <summary>
/// 重载DetachInterfaces,释放IWebBrowser2接口对象
/// </summary>
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void DetachInterfaces()
{
webBroswer2 = null;
base.DetachInterfaces();
}
/// <summary>
/// 重载CreateSink,映射DWebBrowserEvent2事件接口到WebBrowserExtendedEvents类
/// </summary>
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void CreateSink()
{
base.CreateSink();
events = new WebBrowserExtendedEvents(this);
cookie = new AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(DWebBrowserEvents2));
}
/// <summary>
/// 重载DetachSink,释放WebBrowserExtendedEvents对象
/// </summary>
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void DetachSink()
{
if (null != cookie)
{
cookie.Disconnect();
cookie = null;
}
}
/// <summary>
/// 下载进度改变事件
/// </summary>
protected override void OnProgressChanged(WebBrowserProgressChangedEventArgs e)
{
base.OnProgressChanged(e);
totalSize = e.MaximumProgress;
downloadSize = e.CurrentProgress;
}
/// <summary>
/// 开始下载事件
/// </summary>
protected void OnDownloading(EventArgs e)
{
if (Downloading != null)
Downloading(this, e);
}
/// <summary>
/// 下载完成事件
/// </summary>
protected virtual void OnDownloadComplete(EventArgs e)
{
if (DownloadComplete != null)
DownloadComplete(this, e);
}
/// <summary>
/// 打开新窗口事件
/// </summary>
protected void OnNewWindow2(WebBrowserExNavigatingEventArgs e)
{
if (e == null)
throw new ArgumentNullException("e");
if (this.NewWindow2 != null)
this.NewWindow2(this, e);
}
/// <summary>
/// 开始跳转到网址事件
/// </summary>
protected void OnNavigating2(WebBrowserExNavigatingEventArgs e)
{
if (e == null)
throw new ArgumentNullException("e");
if (this.Navigating2 != null)
this.Navigating2(this, e);
}
/// <summary>
/// 关闭窗口事件
/// </summary>
protected void OnQuit()
{
EventHandler exit = Quit;
if (exit != null)
exit(this, EventArgs.Empty);
}
/// <summary>
/// 标题改变事件
/// </summary>
protected void OnTitleChange(EventArgs e)
{
if (TitleChanged != null)
TitleChanged(this, e);
}
/// <summary>
/// 重载消息处理函数,触发OnQuit事件
/// </summary>
/// <param name="m"></param>
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
if (m.Msg == (int)WindowsMessages.WM_PARENTNOTIFY)
{
int wParam = m.WParam.ToInt32();
if ((int)(wParam & 0xFFFF) == (int)WindowsMessages.WM_DESTROY)
this.OnQuit();
}
base.WndProc(ref m);
}
/// <summary>
/// 获取字体缩放值
/// </summary>
public ZoomLevel GetZoom()
{
object pvaIn=null;
IntPtr pvaOut = IntPtr.Zero;
webBroswer2.ExecWB(OLECMDID.OLECMDID_ZOOM, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref pvaIn, pvaOut);
try
{
return (ZoomLevel)pvaOut.ToInt32();
}
catch
{
}
return ZoomLevel.Middle;
}
/// <summary>
/// 设置字体缩放值
/// </summary>
/// <param name="zoom">将要设置的字体缩放值</param>
public void SetZoom(ZoomLevel zoom)
{
int z = (int)zoom;
object pvaIn = z;
IntPtr pvaOut = IntPtr.Zero;
webBroswer2.ExecWB(OLECMDID.OLECMDID_ZOOM, OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref pvaIn, pvaOut);
if (ZoomLevelChanged != null)
ZoomLevelChanged(this, EventArgs.Empty);
}
#region WebBrowserExtendedEvents
/// <summary>
/// DWebBrowserEvent2事件处理类,参见MSDN
/// </summary>
protected class WebBrowserExtendedEvents : DWebBrowserEvents2
{
/// <summary>
/// 浏览器对象
/// </summary>
WebBrowserEx browser;
/// <summary>
/// 构造函数
/// </summary>
public WebBrowserExtendedEvents()
{
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="browser">要处理事件所对应的浏览器对象</param>
public WebBrowserExtendedEvents(WebBrowserEx browser)
{
this.browser = browser;
}
#region DWebBrowserEvents2成员,参见MSDN
public void BeforeNavigate2(object pDisp, ref object URL, ref object flags, ref object targetFrameName, ref object postData, ref object headers, ref bool cancel)
{
Uri urlUri = new Uri(URL.ToString());
string tFrame = null;
if (targetFrameName != null)
tFrame = targetFrameName.ToString();
WebBrowserExNavigatingEventArgs args = new WebBrowserExNavigatingEventArgs(pDisp, urlUri, tFrame, UrlContext.None);
browser.OnNavigating2(args);
cancel = args.Cancel;
pDisp = args.AutomationObject;
}
public void NewWindow2(ref object pDisp, ref bool cancel)
{
WebBrowserExNavigatingEventArgs args = new WebBrowserExNavigatingEventArgs(pDisp, null, null, UrlContext.None);
browser.OnNewWindow2(args);
cancel = args.Cancel;
pDisp = args.AutomationObject;
}
public void NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl)
{
WebBrowserExNavigatingEventArgs args = new WebBrowserExNavigatingEventArgs(ppDisp, new Uri(bstrUrl), null, (UrlContext)dwFlags);
browser.OnNewWindow2(args);
Cancel = args.Cancel;
ppDisp = args.AutomationObject;
}
public void DownloadBegin()
{
browser.OnDownloading(EventArgs.Empty);
}
public void DownloadComplete()
{
browser.OnDownloadComplete(EventArgs.Empty);
}
public void TitleChange(string text)
{
browser.OnTitleChange(EventArgs.Empty);
}
#region 未处理的事件
// This event doesn't fire.
[DispId(0x00000107)]
public void WindowClosing(bool isChildWindow, ref bool cancel)
{
}
public void OnQuit()
{
}
public void StatusTextChange(string text)
{
}
public void ProgressChange(int progress, int progressMax)
{
}
public void PropertyChange(string szProperty)
{
}
public void NavigateComplete2(object pDisp, ref object URL)
{
}
public void DocumentComplete(object pDisp, ref object URL)
{
}
public void OnVisible(bool visible)
{
}
public void OnToolBar(bool toolBar)
{
}
public void OnMenuBar(bool menuBar)
{
}
public void OnStatusBar(bool statusBar)
{
}
public void OnFullScreen(bool fullScreen)
{
}
public void OnTheaterMode(bool theaterMode)
{
}
public void WindowSetResizable(bool resizable)
{
}
public void WindowSetLeft(int left)
{
}
public void WindowSetTop(int top)
{
}
public void WindowSetWidth(int width)
{
}
public void WindowSetHeight(int height)
{
}
public void SetSecureLockIcon(int secureLockIcon)
{
}
public void FileDownload(ref bool cancel)
{
}
public void NavigateError(object pDisp, ref object URL, ref object frame, ref object statusCode, ref bool cancel)
{
}
public void PrintTemplateInstantiation(object pDisp)
{
}
public void PrintTemplateTeardown(object pDisp)
{
}
public void UpdatePageStatus(object pDisp, ref object nPage, ref object fDone)
{
}
public void PrivacyImpactedStateChange(bool bImpacted)
{
}
public void CommandStateChange(int Command, bool Enable)
{
}
public void ClientToHostWindow(ref int CX, ref int CY)
{
}
#endregion
#endregion
}
#endregion
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -