若要使用此功能,请实现从
WebBrowser
和
WebBrowser.WebBrowserSite
类继承的类。非托管
WebBrowser
ActiveX 控件使用受保护的
CreateWebBrowserSiteBase
方法检索由
WebBrowser.WebBrowserSite
类实现的扩展性接口。重写
CreateWebBrowserSiteBase
方法以返回本身的从
WebBrowser.WebBrowserSite
类继承的类的实例。
WebBrowser.WebBrowserSite
类提供 OLE
IDocHostUIHandler
的默认实现。您能够为此接口提供本身的实现,或者实现任何其余
WebBrowser
ActiveX 控件接口,从而对控件行为进行自定义。』
能够看出,咱们只需重写
CreateWebBrowserSiteBase
方法,扩展
WebBrowserSite
,即可实现对浏览器控件的扩展。
咱们知道,IDocHostUIHandler ,IDocHostUIHandler2 和 IDocHostShowUI
这三个
接口是浏览器控件用户界面的自定义的
核心。当一个容器提供对ActiveX
控件支持
的时候 ,
当浏览器控件被实例化
时,若是
可能的话,它尝试找来自
宿主的 IDocHostUIHandler , IDocHostUIHandler2 和 IDocHostShowUI
实现。当咱们修改
浏览器控件的时候 , 这些是咱们应该在程序中实现的
接口。
在这里,咱们须要的仅仅是
截获"浏览器的信息
对话框"弹出消息,因此咱们也没有必要把全部这些接口所有实现一遍。
IDocHostShowUI 这个接口提供给咱们对浏览器控件显示的信息对话框和帮助的控制。咱们实现它,这样在浏览器控件显示它本身的任何的信息或帮助以前 ,能调用咱们定义的IDocHostShowUI的方法。这样咱们便有一个机会捕获该信息对话框弹出的消息。IDocHostShowUI有两个方法,IDocHostShowUI::ShowMessage和IDocHostShowUI::ShowHelp。
已经准备得很充分了。如今开工!!!
在文件UnsafeNativeMethods.cs的 public class UnsafeNativeMethods里面添加以下代码:
#region IDocHostShowUI
[StructLayout(LayoutKind.Explicit, Pack = 4)]
public struct __MIDL_IWinTypes_0009
{
// Fields
[FieldOffset(0)]
public int hInproc;
[FieldOffset(0)]
public int hRemote;
}
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct _RemotableHandle
{
public int fContext;
public __MIDL_IWinTypes_0009 u;
}
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct tagPOINT
{
public int x;
public int y;
}
[ComImport, Guid("C4D244B0-D43E-11CF-893B-00AA00BDCE1A"), InterfaceType((short)1)]
public interface IDocHostShowUI
{
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void ShowMessage([In, ComAliasName("ExtendedWebBrowser2.UnsafeNativeMethods.wireHWND")] ref _RemotableHandle hwnd, [In, MarshalAs(UnmanagedType.LPWStr)] string lpstrText, [In, MarshalAs(UnmanagedType.LPWStr)] string lpstrCaption, [In] uint dwType, [In, MarshalAs(UnmanagedType.LPWStr)] string lpstrHelpFile, [In] uint dwHelpContext, [ComAliasName("ExtendedWebBrowser2.UnsafeNativeMethods.LONG_PTR")] out int plResult);
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void ShowHelp([In, ComAliasName("ExtendedWebBrowser2.UnsafeNativeMethods.wireHWND")] ref _RemotableHandle hwnd, [In, MarshalAs(UnmanagedType.LPWStr)] string pszHelpFile, [In] uint uCommand, [In] uint dwData, [In] tagPOINT ptMouse, [Out, MarshalAs(UnmanagedType.IDispatch)] object pDispatchObjectHit);
}
#endregion
在文件ExtendedWebBrowser.cs的 public class ExtendedWebBrowser : System.Windows.Forms.WebBrowser里面添加以下代码:
#region ExtendedWebBrowserSite
class ExtendedWebBrowserSite : WebBrowser.WebBrowserSite, UnsafeNativeMethods.IDocHostShowUI
{
public ExtendedWebBrowserSite(WebBrowser host)
: base(host)
{
}
void UnsafeNativeMethods.IDocHostShowUI.ShowMessage(ref UnsafeNativeMethods._RemotableHandle hwnd, string lpstrText, string lpstrCaption, uint dwType, string lpstrHelpFile, uint dwHelpContext, out int plResult)
{
//TODO:自定义
}
void UnsafeNativeMethods.IDocHostShowUI.ShowHelp(ref UnsafeNativeMethods._RemotableHandle hwnd, string pszHelpFile, uint uCommand, uint dwData, UnsafeNativeMethods.tagPOINT ptMouse, object pDispatchObjectHit)
{
//TODO:自定义
}
}
protected override WebBrowserSiteBase CreateWebBrowserSiteBase()
{
return new ExtendedWebBrowserSite(this);
}
#endregion
OK,如今即可以添加相应的自定义事件了,这个轻车熟路,再也不赘述。