RaUI/Source/ryControls/ExtendedWebBrowser/ExtendedWebBrowser.cs
2020-11-28 15:03:57 +08:00

911 lines
31 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Security;
using System.ComponentModel;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Windows.Forms;
using System.Security.Permissions;
using IfacesEnumsStructsClasses;
using System.IO;
namespace ExtendedWebBrowser2
{
/// <summary>
/// An extended version of the <see cref="WebBrowser"/> control.
/// </summary>
public class ExtendedWebBrowser : System.Windows.Forms.WebBrowser
{
private UnsafeNativeMethods.IWebBrowser2 axIWebBrowser2;
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void DocHostShowUIShowMessageEventHandler(object sender, ExtendedBrowserMessageEventArgs e);
/// <summary>
/// 在页面弹出消息对话框时激发
/// </summary>
[Description("在页面弹出消息对话框时激发")]
public event DocHostShowUIShowMessageEventHandler OnShowMessage = null;
/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public delegate void DocHostShowUIExtendedCloseEventArgs(object sender, ExtendedCloseEventArgs e);
/// <summary>
///
/// </summary>
public event DocHostShowUIExtendedCloseEventArgs Ex_WindowClosing = null;
/// <summary>
///
/// </summary>
public Command Cmd;
/// <summary>
/// 打开页面并等待页面加载完毕
/// </summary>
/// <param name="url">要打开的页面地址</param>
/// <param name="seconds">小于等于0,则表示一直等待,否则表示等待指定秒后,如果依然没有加载完毕,就直接返回</param>
public void NavigateWait(string url, int seconds)
{
this.Navigate(url);
WaitComplete(seconds);
}
/// <summary>
/// 等待页面加载完毕
/// </summary>
/// <param name="seconds">小于等于0,则表示一直等待,否则表示等待指定秒后,如果依然没有加载完毕,就直接返回</param>
public bool WaitComplete(int seconds)
{
DateTime startTime = DateTime.Now;
while (this.ReadyState != WebBrowserReadyState.Complete)
{
if (DateTime.Now >= startTime.AddSeconds(seconds) && seconds > 0)
{
return false;
}
System.Windows.Forms.Application.DoEvents();
}
return true;
}
/// <summary>
/// 等待指定毫秒
/// </summary>
/// <param name="Milliseconds">等待指定毫秒</param>
public void Wait(int Milliseconds)
{
if (Milliseconds <= 0) { return; }
DateTime startTime = DateTime.Now;
while (true)
{
if (DateTime.Now >= startTime.AddMilliseconds(Milliseconds) && Milliseconds > 0)
{
break;
}
System.Windows.Forms.Application.DoEvents();
}
}
/// <summary>
/// 获取网页源代码,可以自动去除乱码
/// </summary>
/// <returns></returns>
public new string DocumentText
{
get
{
Encoding encoding = Encoding.GetEncoding(this.Document.Encoding);
System.IO.StreamReader strm = new System.IO.StreamReader(this.DocumentStream, encoding);
string docment = strm.ReadToEnd();
return docment;
}
set { base.DocumentText = value; }
}
/// <summary>
/// 加载html文本到浏览器中
/// </summary>
/// <param name="s"></param>
/// <param name="encoding"></param>
public void LoadStrings(string s,Encoding encoding)
{
NavigateWait("about:blank", 10);
//内存流用于转换string
MemoryStream ms = new MemoryStream();
try
{
byte[] htmlcode = encoding.GetBytes(s);
ms.Write(htmlcode, 0, htmlcode.Length);
Stream dataStream = ms;
//恢复指针位置
dataStream.Seek(0, 0);
if (this.Document != null)
{
//转换接口并转换为IStream
(this.Document.DomDocument as UnsafeNativeMethods.IPersistStreamInit).Load(new UnsafeNativeMethods.ComStreamFromDataStream(dataStream));
this.Document.Encoding = encoding.WebName; ;
}
}
finally
{
ms.Close();
}
}
/// <summary>
/// 加载html文本到浏览器中
/// </summary>
/// <param name="s"></param>
public void LoadStrings(string s)
{
LoadStrings(s, System.Text.Encoding.Default);
}
bool _ForceOpenThisWindow = false;
/// <summary>
/// 强制用本窗体打开新链接
/// </summary>
[Description("强制用本窗体打开新链接")]
public bool ForceOpenThisWindow
{
get { return _ForceOpenThisWindow; }
set { _ForceOpenThisWindow = value; }
}
#region ExtendedWebBrowserSite
class ExtendedWebBrowserSite : WebBrowser.WebBrowserSite, UnsafeNativeMethods.IDocHostShowUI
{
private ExtendedWebBrowser _Browser;
public ExtendedWebBrowserSite(ExtendedWebBrowser host)
: base(host)
{
_Browser = host;
}
//public event EventHandler<ExtendedBrowserMessageEventArgs> OnShowMessage;
#region IDocHostShowUI
int UnsafeNativeMethods.IDocHostShowUI.ShowMessage(int hwnd, string lpstrText,
string lpstrCaption, uint dwType,
string lpstrHelpFile, uint dwHelpContext, ref int lpResult)
{
//Initially
//lpResult is set 0 //S_OK
//Host did not display its UI. MSHTML displays its message box.
int iRet = Hresults.S_FALSE;
//raise event?
ExtendedBrowserMessageEventArgs args = new ExtendedBrowserMessageEventArgs(hwnd, lpstrText, lpstrCaption, dwType, lpstrHelpFile, dwHelpContext);
_Browser.OnShowMessage(this, args);
if (args.Cancel == true)
{
//Host displayed its user interface (UI). MSHTML does not display its message box.
iRet = Hresults.S_OK;
lpResult = args.PResult;
}
////uncomment to use
//else
//{
// lpResult = (int)WinApis.MessageBox(hwnd, lpstrText, lpstrCaption, dwType);
// iRet = Hresults.S_OK;
//}
return iRet;
}
int UnsafeNativeMethods.IDocHostShowUI.ShowHelp(int hwnd, string pszHelpFile, uint uCommand, uint dwData, UnsafeNativeMethods.tagPOINT ptMouse, object pDispatchObjectHit)
{
return Hresults.E_NOTIMPL;
}
#endregion
}
/// <summary>
///
/// </summary>
/// <returns></returns>
protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
{
return new ExtendedWebBrowserSite(this);
}
#endregion
/// <summary>
/// This method supports the .NET Framework infrastructure and is not intended to be used directly from your code.
/// Called by the control when the underlying ActiveX control is created.
/// </summary>
/// <param name="nativeActiveXObject"></param>
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void AttachInterfaces(object nativeActiveXObject)
{
this.axIWebBrowser2 = (UnsafeNativeMethods.IWebBrowser2)nativeActiveXObject;
this.axIWebBrowser2.Silent = true;
base.AttachInterfaces(nativeActiveXObject);
Cmd = new Command(this);
}
/// <summary>
/// This method supports the .NET Framework infrastructure and is not intended to be used directly from your code.
/// Called by the control when the underlying ActiveX control is discarded.
/// </summary>
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void DetachInterfaces()
{
this.axIWebBrowser2 = null;
base.DetachInterfaces();
}
/// <summary>
/// Returns the automation object for the web browser
/// </summary>
public object Application
{
get { return axIWebBrowser2.Application; }
}
System.Windows.Forms.AxHost.ConnectionPointCookie cookie;
WebBrowserExtendedEvents events;
/// <summary>
/// This method will be called to give you a chance to create your own event sink
/// </summary>
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void CreateSink()
{
// Make sure to call the base class or the normal events won't fire
base.CreateSink();
events = new WebBrowserExtendedEvents(this);
cookie = new AxHost.ConnectionPointCookie(this.ActiveXInstance, events, typeof(UnsafeNativeMethods.DWebBrowserEvents2));
}
/// <summary>
/// Detaches the event sink
/// </summary>
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void DetachSink()
{
if (null != cookie)
{
cookie.Disconnect();
cookie = null;
}
}
/// <summary>
/// 在文档下载开始时激发
/// </summary>
[Description("在文档下载开始时激发")]
public event EventHandler Downloading;
/// <summary>
/// Raises the <see cref="Downloading"/> event
/// </summary>
/// <param name="e">Empty <see cref="EventArgs"/></param>
/// <remarks>
/// You could start an animation or a notification that downloading is starting
/// </remarks>
protected void OnDownloading(EventArgs e)
{
Downloading?.Invoke(this, e);
}
/// <summary>
/// 下载完成后触发
/// </summary>
/// <remarks>
/// Here you could start monitoring for script errors.
/// </remarks>
[Description("在文档下载完毕后激发")]
public event EventHandler DownloadComplete;
/// <summary>
/// Raises the <see cref="DownloadComplete"/> event
/// </summary>
/// <param name="e">Empty <see cref="EventArgs"/></param>
public virtual void OnDownloadComplete(EventArgs e)
{
DownloadComplete?.Invoke(this, e);
}
/// <summary>
/// 在开始浏览新网页时激发.
/// </summary>
[Description("在开始浏览新网页时激发")]
public event EventHandler<BrowserExtendedNavigatingEventArgs> StartNavigate;
/// <summary>
///在打开新的网页窗口时激发
/// </summary>
[Description("在打开新的网页窗口时激发")]
public event EventHandler<BrowserExtendedNavigatingEventArgs> StartNewWindow;
/// <summary>
/// Raises the <see cref="StartNewWindow"/> event
/// </summary>
/// <exception cref="ArgumentNullException">Thrown when BrowserExtendedNavigatingEventArgs is null</exception>
public void OnStartNewWindow(BrowserExtendedNavigatingEventArgs e)
{
if (e == null)
throw new ArgumentNullException("e");
if (_ForceOpenThisWindow)
{
e.Cancel = true;
this.Navigate(e.Url.ToString());
}
else
{
StartNewWindow?.Invoke(this, e);
}
}
/// <summary>
/// Raises the <see cref="StartNavigate"/> event
/// </summary>
/// <exception cref="ArgumentNullException">Thrown when BrowserExtendedNavigatingEventArgs is null</exception>
public void OnStartNavigate(BrowserExtendedNavigatingEventArgs e)
{
if (e == null)
throw new ArgumentNullException("e");
StartNavigate?.Invoke(this, e);
}
#region The Implementation of DWebBrowserEvents2 for firing extra events
/// <summary>
///
/// </summary>
public class WebBrowserExtendedEvents : UnsafeNativeMethods.DWebBrowserEvents2
{
/// <summary>
///
/// </summary>
public WebBrowserExtendedEvents() { }
ExtendedWebBrowser _Browser;
/// <summary>
///
/// </summary>
/// <param name="browser"></param>
public WebBrowserExtendedEvents(ExtendedWebBrowser browser) { _Browser = browser; }
#region DWebBrowserEvents2 Members
//Implement whichever events you wish
/// <summary>
///
/// </summary>
/// <param name="pDisp"></param>
/// <param name="URL"></param>
/// <param name="flags"></param>
/// <param name="targetFrameName"></param>
/// <param name="postData"></param>
/// <param name="headers"></param>
/// <param name="cancel"></param>
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();
BrowserExtendedNavigatingEventArgs args = new BrowserExtendedNavigatingEventArgs(pDisp, urlUri, tFrame, UrlContext.None);
_Browser.OnStartNavigate(args);
cancel = args.Cancel;
pDisp = args.AutomationObject;
}
/// <summary>
///
/// </summary>
/// <param name="pDisp"></param>
/// <param name="cancel"></param>
public void NewWindow2(ref object pDisp, ref bool cancel)
{
BrowserExtendedNavigatingEventArgs args = new BrowserExtendedNavigatingEventArgs(pDisp, null, null, UrlContext.None);
_Browser.OnStartNewWindow(args);
cancel = args.Cancel;
pDisp = args.AutomationObject;
}
/// <summary>
/// 新窗口事件,只限Window XP SP2或以上系统支持
/// </summary>
/// <param name="ppDisp"></param>
/// <param name="Cancel"></param>
/// <param name="dwFlags"></param>
/// <param name="bstrUrlContext"></param>
/// <param name="bstrUrl"></param>
public void NewWindow3(ref object ppDisp, ref bool Cancel, uint dwFlags, string bstrUrlContext, string bstrUrl)
{
BrowserExtendedNavigatingEventArgs args = new BrowserExtendedNavigatingEventArgs(ppDisp, new Uri(bstrUrl), null, (UrlContext)dwFlags);
_Browser.OnStartNewWindow(args);
Cancel = args.Cancel;
ppDisp = args.AutomationObject;
}
/// <summary>
///
/// </summary>
public void DownloadBegin()
{
_Browser.OnDownloading(EventArgs.Empty);
}
/// <summary>
///
/// </summary>
public void DownloadComplete()
{
_Browser.OnDownloadComplete(EventArgs.Empty);
}
#region Unused events
/// <summary>
///
/// </summary>
/// <param name="isChildWindow"></param>
/// <param name="cancel"></param>
[DispId(0x00000107)]
public void WindowClosing(bool isChildWindow, ref bool cancel)
{
ExtendedCloseEventArgs args = new ExtendedCloseEventArgs();
_Browser.Ex_WindowClosing(this, args);
if (args.Cancel == true)
{
//Host displayed its user interface (UI). MSHTML does not display its message box.
cancel = true;
}
}
/// <summary>
///
/// </summary>
public void OnQuit()
{
}
/// <summary>
///
/// </summary>
/// <param name="text"></param>
public void StatusTextChange(string text)
{
}
/// <summary>
///
/// </summary>
/// <param name="progress"></param>
/// <param name="progressMax"></param>
public void ProgressChange(int progress, int progressMax)
{
}
/// <summary>
///
/// </summary>
/// <param name="text"></param>
public void TitleChange(string text)
{
}
/// <summary>
///
/// </summary>
/// <param name="szProperty"></param>
public void PropertyChange(string szProperty)
{
}
/// <summary>
///
/// </summary>
/// <param name="pDisp"></param>
/// <param name="URL"></param>
public void NavigateComplete2(object pDisp, ref object URL)
{
}
/// <summary>
///
/// </summary>
/// <param name="pDisp"></param>
/// <param name="URL"></param>
public void DocumentComplete(object pDisp, ref object URL)
{
}
/// <summary>
///
/// </summary>
/// <param name="visible"></param>
public void OnVisible(bool visible)
{
}
/// <summary>
///
/// </summary>
/// <param name="toolBar"></param>
public void OnToolBar(bool toolBar)
{
}
/// <summary>
///
/// </summary>
/// <param name="menuBar"></param>
public void OnMenuBar(bool menuBar)
{
}
/// <summary>
///
/// </summary>
/// <param name="statusBar"></param>
public void OnStatusBar(bool statusBar)
{
}
/// <summary>
///
/// </summary>
/// <param name="fullScreen"></param>
public void OnFullScreen(bool fullScreen)
{
}
/// <summary>
///
/// </summary>
/// <param name="theaterMode"></param>
public void OnTheaterMode(bool theaterMode)
{
}
/// <summary>
///
/// </summary>
/// <param name="resizable"></param>
public void WindowSetResizable(bool resizable)
{
}
/// <summary>
///
/// </summary>
/// <param name="left"></param>
public void WindowSetLeft(int left)
{
}
/// <summary>
///
/// </summary>
/// <param name="top"></param>
public void WindowSetTop(int top)
{
}
/// <summary>
///
/// </summary>
/// <param name="width"></param>
public void WindowSetWidth(int width)
{
}
/// <summary>
///
/// </summary>
/// <param name="height"></param>
public void WindowSetHeight(int height)
{
}
/// <summary>
///
/// </summary>
/// <param name="secureLockIcon"></param>
public void SetSecureLockIcon(int secureLockIcon)
{
}
/// <summary>
///
/// </summary>
/// <param name="cancel"></param>
public void FileDownload(ref bool cancel)
{
//MessageBox.Show("1122");
}
/// <summary>
/// /
/// </summary>
/// <param name="pDisp"></param>
/// <param name="URL"></param>
/// <param name="frame"></param>
/// <param name="statusCode"></param>
/// <param name="cancel"></param>
public void NavigateError(object pDisp, ref object URL, ref object frame, ref object statusCode, ref bool cancel)
{
}
/// <summary>
///
/// </summary>
/// <param name="pDisp"></param>
public void PrintTemplateInstantiation(object pDisp)
{
}
/// <summary>
///
/// </summary>
/// <param name="pDisp"></param>
public void PrintTemplateTeardown(object pDisp)
{
}
/// <summary>
///
/// </summary>
/// <param name="pDisp"></param>
/// <param name="nPage"></param>
/// <param name="fDone"></param>
public void UpdatePageStatus(object pDisp, ref object nPage, ref object fDone)
{
}
/// <summary>
///
/// </summary>
/// <param name="bImpacted"></param>
public void PrivacyImpactedStateChange(bool bImpacted)
{
}
/// <summary>
///
/// </summary>
/// <param name="Command"></param>
/// <param name="Enable"></param>
public void CommandStateChange(int Command, bool Enable)
{
}
/// <summary>
///
/// </summary>
/// <param name="CX"></param>
/// <param name="CY"></param>
public void ClientToHostWindow(ref int CX, ref int CY)
{
}
#endregion
#endregion
}
#endregion
#region Raises the Quit event when the browser window is about to be destroyed
/// <summary>
/// Overridden
/// </summary>
/// <param name="m">The <see cref="Message"/> send to this procedure</param>
[PermissionSet(SecurityAction.LinkDemand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
if (m.Msg == (int)WindowsMessages.WM_PARENTNOTIFY)
{
//int lp = m.LParam.ToInt32();
int wp = m.WParam.ToInt32();
int X = wp & 0xFFFF;
//int Y = (wp >> 16) & 0xFFFF;
if (X == (int)WindowsMessages.WM_DESTROY)
this.OnQuit();
}
base.WndProc(ref m);
}
/// <summary>
/// A list of all the available window messages
/// </summary>
enum WindowsMessages
{
WM_ACTIVATE = 0x6,
WM_ACTIVATEAPP = 0x1C,
WM_AFXFIRST = 0x360,
WM_AFXLAST = 0x37F,
WM_APP = 0x8000,
WM_ASKCBFORMATNAME = 0x30C,
WM_CANCELJOURNAL = 0x4B,
WM_CANCELMODE = 0x1F,
WM_CAPTURECHANGED = 0x215,
WM_CHANGECBCHAIN = 0x30D,
WM_CHAR = 0x102,
WM_CHARTOITEM = 0x2F,
WM_CHILDACTIVATE = 0x22,
WM_CLEAR = 0x303,
WM_CLOSE = 0x10,
WM_COMMAND = 0x111,
WM_COMPACTING = 0x41,
WM_COMPAREITEM = 0x39,
WM_CONTEXTMENU = 0x7B,
WM_COPY = 0x301,
WM_COPYDATA = 0x4A,
WM_CREATE = 0x1,
WM_CTLCOLORBTN = 0x135,
WM_CTLCOLORDLG = 0x136,
WM_CTLCOLOREDIT = 0x133,
WM_CTLCOLORLISTBOX = 0x134,
WM_CTLCOLORMSGBOX = 0x132,
WM_CTLCOLORSCROLLBAR = 0x137,
WM_CTLCOLORSTATIC = 0x138,
WM_CUT = 0x300,
WM_DEADCHAR = 0x103,
WM_DELETEITEM = 0x2D,
WM_DESTROY = 0x2,
WM_DESTROYCLIPBOARD = 0x307,
WM_DEVICECHANGE = 0x219,
WM_DEVMODECHANGE = 0x1B,
WM_DISPLAYCHANGE = 0x7E,
WM_DRAWCLIPBOARD = 0x308,
WM_DRAWITEM = 0x2B,
WM_DROPFILES = 0x233,
WM_ENABLE = 0xA,
WM_ENDSESSION = 0x16,
WM_ENTERIDLE = 0x121,
WM_ENTERMENULOOP = 0x211,
WM_ENTERSIZEMOVE = 0x231,
WM_ERASEBKGND = 0x14,
WM_EXITMENULOOP = 0x212,
WM_EXITSIZEMOVE = 0x232,
WM_FONTCHANGE = 0x1D,
WM_GETDLGCODE = 0x87,
WM_GETFONT = 0x31,
WM_GETHOTKEY = 0x33,
WM_GETICON = 0x7F,
WM_GETMINMAXINFO = 0x24,
WM_GETOBJECT = 0x3D,
WM_GETTEXT = 0xD,
WM_GETTEXTLENGTH = 0xE,
WM_HANDHELDFIRST = 0x358,
WM_HANDHELDLAST = 0x35F,
WM_HELP = 0x53,
WM_HOTKEY = 0x312,
WM_HSCROLL = 0x114,
WM_HSCROLLCLIPBOARD = 0x30E,
WM_ICONERASEBKGND = 0x27,
WM_IME_CHAR = 0x286,
WM_IME_COMPOSITION = 0x10F,
WM_IME_COMPOSITIONFULL = 0x284,
WM_IME_CONTROL = 0x283,
WM_IME_ENDCOMPOSITION = 0x10E,
WM_IME_KEYDOWN = 0x290,
WM_IME_KEYLAST = 0x10F,
WM_IME_KEYUP = 0x291,
WM_IME_NOTIFY = 0x282,
WM_IME_REQUEST = 0x288,
WM_IME_SELECT = 0x285,
WM_IME_SETCONTEXT = 0x281,
WM_IME_STARTCOMPOSITION = 0x10D,
WM_INITDIALOG = 0x110,
WM_INITMENU = 0x116,
WM_INITMENUPOPUP = 0x117,
WM_INPUTLANGCHANGE = 0x51,
WM_INPUTLANGCHANGEREQUEST = 0x50,
WM_KEYDOWN = 0x100,
WM_KEYFIRST = 0x100,
WM_KEYLAST = 0x108,
WM_KEYUP = 0x101,
WM_KILLFOCUS = 0x8,
WM_LBUTTONDBLCLK = 0x203,
WM_LBUTTONDOWN = 0x201,
WM_LBUTTONUP = 0x202,
WM_MBUTTONDBLCLK = 0x209,
WM_MBUTTONDOWN = 0x207,
WM_MBUTTONUP = 0x208,
WM_MDIACTIVATE = 0x222,
WM_MDICASCADE = 0x227,
WM_MDICREATE = 0x220,
WM_MDIDESTROY = 0x221,
WM_MDIGETACTIVE = 0x229,
WM_MDIICONARRANGE = 0x228,
WM_MDIMAXIMIZE = 0x225,
WM_MDINEXT = 0x224,
WM_MDIREFRESHMENU = 0x234,
WM_MDIRESTORE = 0x223,
WM_MDISETMENU = 0x230,
WM_MDITILE = 0x226,
WM_MEASUREITEM = 0x2C,
WM_MENUCHAR = 0x120,
WM_MENUCOMMAND = 0x126,
WM_MENUDRAG = 0x123,
WM_MENUGETOBJECT = 0x124,
WM_MENURBUTTONUP = 0x122,
WM_MENUSELECT = 0x11F,
WM_MOUSEACTIVATE = 0x21,
WM_MOUSEFIRST = 0x200,
WM_MOUSEHOVER = 0x2A1,
WM_MOUSELAST = 0x20A,
WM_MOUSELEAVE = 0x2A3,
WM_MOUSEMOVE = 0x200,
WM_MOUSEWHEEL = 0x20A,
WM_MOVE = 0x3,
WM_MOVING = 0x216,
WM_NCACTIVATE = 0x86,
WM_NCCALCSIZE = 0x83,
WM_NCCREATE = 0x81,
WM_NCDESTROY = 0x82,
WM_NCHITTEST = 0x84,
WM_NCLBUTTONDBLCLK = 0xA3,
WM_NCLBUTTONDOWN = 0xA1,
WM_NCLBUTTONUP = 0xA2,
WM_NCMBUTTONDBLCLK = 0xA9,
WM_NCMBUTTONDOWN = 0xA7,
WM_NCMBUTTONUP = 0xA8,
WM_NCMOUSEHOVER = 0x2A0,
WM_NCMOUSELEAVE = 0x2A2,
WM_NCMOUSEMOVE = 0xA0,
WM_NCPAINT = 0x85,
WM_NCRBUTTONDBLCLK = 0xA6,
WM_NCRBUTTONDOWN = 0xA4,
WM_NCRBUTTONUP = 0xA5,
WM_NEXTDLGCTL = 0x28,
WM_NEXTMENU = 0x213,
WM_NOTIFY = 0x4E,
WM_NOTIFYFORMAT = 0x55,
WM_NULL = 0x0,
WM_PAINT = 0xF,
WM_PAINTCLIPBOARD = 0x309,
WM_PAINTICON = 0x26,
WM_PALETTECHANGED = 0x311,
WM_PALETTEISCHANGING = 0x310,
WM_PARENTNOTIFY = 0x210,
WM_PASTE = 0x302,
WM_PENWINFIRST = 0x380,
WM_PENWINLAST = 0x38F,
WM_POWER = 0x48,
WM_PRINT = 0x317,
WM_PRINTCLIENT = 0x318,
WM_QUERYDRAGICON = 0x37,
WM_QUERYENDSESSION = 0x11,
WM_QUERYNEWPALETTE = 0x30F,
WM_QUERYOPEN = 0x13,
WM_QUEUESYNC = 0x23,
WM_QUIT = 0x12,
WM_RBUTTONDBLCLK = 0x206,
WM_RBUTTONDOWN = 0x204,
WM_RBUTTONUP = 0x205,
WM_RENDERALLFORMATS = 0x306,
WM_RENDERFORMAT = 0x305,
WM_SETCURSOR = 0x20,
WM_SETFOCUS = 0x7,
WM_SETFONT = 0x30,
WM_SETHOTKEY = 0x32,
WM_SETICON = 0x80,
WM_SETREDRAW = 0xB,
WM_SETTEXT = 0xC,
WM_SETTINGCHANGE = 0x1A,
WM_SHOWWINDOW = 0x18,
WM_SIZE = 0x5,
WM_SIZECLIPBOARD = 0x30B,
WM_SIZING = 0x214,
WM_SPOOLERSTATUS = 0x2A,
WM_STYLECHANGED = 0x7D,
WM_STYLECHANGING = 0x7C,
WM_SYNCPAINT = 0x88,
WM_SYSCHAR = 0x106,
WM_SYSCOLORCHANGE = 0x15,
WM_SYSCOMMAND = 0x112,
WM_SYSDEADCHAR = 0x107,
WM_SYSKEYDOWN = 0x104,
WM_SYSKEYUP = 0x105,
WM_TCARD = 0x52,
WM_TIMECHANGE = 0x1E,
WM_TIMER = 0x113,
WM_UNDO = 0x304,
WM_UNINITMENUPOPUP = 0x125,
WM_USER = 0x400,
WM_USERCHANGED = 0x54,
WM_VKEYTOITEM = 0x2E,
WM_VSCROLL = 0x115,
WM_VSCROLLCLIPBOARD = 0x30A,
WM_WINDOWPOSCHANGED = 0x47,
WM_WINDOWPOSCHANGING = 0x46,
WM_WININICHANGE = 0x1A
}
/// <summary>
/// Raises the <see cref="Quit"/> event
/// </summary>
protected void OnQuit()
{
EventHandler h = Quit;
h?.Invoke(this, EventArgs.Empty);
}
/// <summary>
/// 在网页窗口关闭时激发
/// </summary>
/// <remarks>
/// Do not confuse this with DWebBrowserEvents2.Quit... That's something else.
/// </remarks>
[Description("在网页窗口关闭时激发")]
public event EventHandler Quit;
#endregion
}
}