研究分屏的坎坷之路——软件实现方案

项目要求:在一个3*2多屏界面上显示2个不同网站内容。在使用分屏软件Radeon设置多次失败后,我们决定使用其它替代方案——使用winform程序嵌入浏览器展示网页。

尝试方案一(WebBrowser):

C#设定分屏布局,然后使用WebBrowser展示百度首页,几分种搞定,非常顺利。自以为搞定之际,使用指定的网站地址测试时,发现报js异常。

经过排查,发现WebBrowser使用的是IE内核。而我们指定的网站,对于IE兼容性差,只能选择其它方案。

此种方案失败。

尝试方案二(WebKit.net):

接着,尝试把WebBrowser控件替换为Chrome内核,经过测试,发现兼容性居然还存在问题。

很郁闷,还是失败。

尝试方案三(CefSharp):

发现CefSharp真是个好东西,不但开源、支持Chromium内核,还具备Winform和WPF的版本。awesominum可以允许把网页嵌入到 3D 画面或游戏中,支持Unity3D,于是决定潜心研究。

1、编写案例

代码示例:

using System;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;

namespace BigScreen
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
            InitBrowser();
        }
        
        public ChromiumWebBrowser browser;
        public void InitBrowser()
        {
            Cef.Initialize(new CefSettings());
            
            browser = new ExtChromiumBrowser("www.baidu.com");
            this.tableLayoutPanel1.Controls.Add(browser);
            browser.Dock = DockStyle.Fill;
        }
    }
}

踩到的一些坑:

1.使用NuGet添加CefSharp相关包,遇到莫名问题,弃用之。改用下载zip包,手动添加引用,并且将包资源放到 /bin/debug 目录下,提示成功。
2.编译时,Platform 必须指定 x64/x86 平台,不能使用Any CPU,否则会编译出错。

编译允许,正是所需要的效果,总算踩过第一个坑。

2、优化组件

由于网站存在打开新页面的情况,需要不弹出页面的功能,只能优化控件。

  • 2.1 拦截事件优化处理
public class CefLifeSpanHandler : CefSharp.ILifeSpanHandler
    {
        public CefLifeSpanHandler() {}
        public bool DoClose(IWebBrowser browserControl, CefSharp.IBrowser browser)
        {
            if (browser.IsDisposed || browser.IsPopup)
            {
                return false;
            }
            return true;
        }

        public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser)
        {
        }

        public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser)
        {
        }


        public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
        {
            var chromiumWebBrowser = (ExtChromiumBrowser)browserControl;
  		    chromiumWebBrowser.Load(targetUrl);
            newBrowser = null;
            return true;
        }
    }
  • 2.2 将新拦截事件类,绑定到组件扩展类
   public class ExtChromiumBrowser : ChromiumWebBrowser
   {
       public ExtChromiumBrowser()  : base(null)
       {
           this.LifeSpanHandler = new CefLifeSpanHandler();
           //this.DownloadHandler = new DownloadHandler(this);
       }

       public ExtChromiumBrowser(string url) : base(url)
       {
           this.LifeSpanHandler = new CefLifeSpanHandler();
       }

       public event EventHandler StartNewWindow;

       public void OnNewWindow(NewWindowEventArgs e)
       {
           if (StartNewWindow != null)
           {
               StartNewWindow(this, e);
           }
       }
   }
  • 2.3 引用新组件
using System;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;

namespace BigScreen
{
   public partial class frmMain : Form
   {
       public frmMain()
       {
           InitializeComponent();
           InitBrowser();
       }
       
       public ExtChromiumBrowser browser;
       public void InitBrowser()
       {
           Cef.Initialize(new CefSettings());
           
           browser = new ExtChromiumBrowser("www.baidu.com");
           this.tableLayoutPanel1.Controls.Add(browser);
           browser.Dock = DockStyle.Fill;
       }
   }
}

到此,总算完成需求,告一段落!

你可能感兴趣的:(研究分屏的坎坷之路——软件实现方案)