在wpf中使用winform webbrowser

563 阅读2分钟

为什么使用winform webbrowser

我们在之前介绍过wpf的webbrowser,wpf的webbrowser坑太多了(js错误,无法获取newwindow事件...)所以不推荐使用它。而winform的webbrowser支持扩展,而且坑比较少,又有大量的资料,因此使用winform webbrowser是一件明确的选择。

为什么扩展winform webbrowser

举个例子在js中调用window.open().这个时候wpf与winform的webbrowser无法监测这个事件,这个时候我们就需要去扩展winform的webbrowser,增加NewWindow3事件,这样当js调用windows.open()时,应用程序中就可以做相应的处理了,如打开一个新的窗口。

如何扩展winform webbrowser

详细的代码请看我的githubgithub.com/huangruifen…

下面是整个扩展项目的类图:

  1. 其中ExtendWebBrowser继承至winform的控件WebBrowser,以及我们自定义用来描述webbrowser事件的接口IWebBrowserEvent。
  2. ExtendedWebBrowserExtension类我主要是用来扩展WebBrowser,现在已经实现的功能有:根据url获取或者设置cookie,清理cookie,session。
  3. DWebBrowserEvents2 接口描述了我们需要扩展的事件,当前项目只是扩展了其中的部分事件,即WebBrowserExtendedEvents中触发的事件。更多支持的事件可以看微软的官方文档:docs.microsoft.com/en-us/dotne…

如何给ExtendWebBrowser扩展DWebBrowserEvents2支持的事件

我们以DownloadBegin事件为例.总共分为3步:

[ComImport, Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch), TypeLibType(TypeLibTypeFlags.FHidden)]
public interface DWebBrowserEvents2
{
    //。。。省略之前的事件
    [System.Runtime.InteropServices.DispId(106)]
    public void DownloadBegin ();
}
  • ExtendedWebBrowser与IWebBrowserEvent中增加想向外暴露的事件。
public interface IWebBrowserEvent
{
    event EventHandler<WebBrowserNavigateErrorEventArgs> NavigateError;
    event EventHandler<NewWindow2EventArgs> NewWindow2;
    event EventHandler<NewWindow3EventArgs> NewWindow3;
    event EventHandler<WindowClosingEventArgs> WindowClosing;
    event EventHandler<DocumentCompleteEventArgs> DocumentComplete;
    event EventHandler<CommandStateChangeEventArgs> CommandStateChange;

    //新加的事件
    event EventHandler DownloadBegin;     
}

public class ExtendedWebBrowser : WebBrowser, IWebBrowserEvent
{
    //。。。现在已有的事件,以及其他逻辑。在这不实现具体请看github.
    public event EventHandler DownloadBegin;

    public void OnDownloadBegin()
    {
        if(null != DownloadBegin)
        {
            DownloadBegin(this,new EventArgs());
        }
    }
}
  • WebBrowserExtendedEvents 进行中转事件。
public class WebBrowserExtendedEvents : StandardOleMarshalObject, DWebBrowserEvents2
{
    //。。。
    //。。。
    public void DownloadBegin ()
    {
        _Browser.OnDownloadBegin();
    }
}

在wpf中使用ExtendWebBrowser

ExtendWebBrowser是扩展winform控件,因此我们需要在项目引用中增加 WindowsFormsIntegration.dll。

然后再xmal中加入wfi的命名空间

 xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"

然后按照下面的方法使用即可,这种方式,对于任意的winform控件都支持。

<wfi:WindowsFormsHost>
    <local:ExtendedWebBrowser x:Name="Browser" Url="www.baidu.com"></local:ExtendedWebBrowser>
</wfi:WindowsFormsHost>

本文标题:在wpf中使用winform webbrowser
文章作者:huangruifeng
发布时间:2019年6月03日 - 20:48
最后更新:2019年6月15日 - 25:34
原始链接
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。