WinForm -- CEF的使用和一些坑处理

https://blog.csdn.net/coolbeliever/article/details/109507780

CEF的引用

1. 通过NuGet包管理器安装cef相应的包

cef包

2. 使用

2.1 初始化

  1.  
    static class Program
  2.  
    {
  3.  
    /// <summary>
  4.  
    /// 应用程序的主入口点。
  5.  
    /// </summary>
  6.  
    [STAThread]
  7.  
    static void Main()
  8.  
    {
  9.  
    // 基本设置
  10.  
    var settings = new CefSettings()
  11.  
    {
  12.  
    //By default CefSharp will use an in-memory cache, you need to specify a Cache Folder to persist data
  13.  
    //CachePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "CefSharp\\Cache")
  14.  
    };
  15.  
    // 设置是否使用GPU
  16.  
    settings.CefCommandLineArgs.Add("disable-gpu", "1");
  17.  
    // 设置是否使用代理服务
  18.  
    settings.CefCommandLineArgs.Add("no-proxy-server", "1");
  19.  
    // 设置是否启动js交互,假如需要原生与js方法互调,则需要设置为true
  20.  
    CefSharpSettings.LegacyJavascriptBindingEnabled = true;
  21.  
    // 初始化
  22.  
    Cef.Initialize(settings, performDependencyCheck: true, browserProcessHandler: null);
  23.  
     
  24.  
    Application.EnableVisualStyles();
  25.  
    Application.SetCompatibleTextRenderingDefault(false);
  26.  
    Application.Run(new SplashForm());
  27.  
    }
  28.  
    }

2.2 Form显示页面

  1.  
    public partial class BrowserForm: Form
  2.  
    {
  3.  
    private ChromiumWebBrowser webBrowser;
  4.  
     
  5.  
    public BrowserForm()
  6.  
    {
  7.  
    InitializeComponent();
  8.  
    }
  9.  
     
  10.  
    private void Form_Load(object sender, EventArgs e)
  11.  
    {
  12.  
    string path = "www.baidu.com";
  13.  
    webBrowser = new ChromiumWebBrowser(path)
  14.  
    {
  15.  
    Dock = DockStyle.Fill,
  16.  
    MenuHandler = new MenuHandler()
  17.  
    };
  18.  
    this.Controls.Add(webBrowser);
  19.  
    }
  20.  
    }

启动程序,百度首页就会被加载出来,一个简单的浏览器就这样实现了

3. cef的复杂使用

  1.  
    public partial class BrowserForm: Form
  2.  
    {
  3.  
    private ChromiumWebBrowser webBrowser;
  4.  
     
  5.  
    public BrowserForm()
  6.  
    {
  7.  
    InitializeComponent();
  8.  
    }
  9.  
     
  10.  
    private void Form_Load(object sender, EventArgs e)
  11.  
    {
  12.  
    string path = "file:///WebRes/view/answerList.html";
  13.  
    webBrowser = new ChromiumWebBrowser(path)
  14.  
    {
  15.  
    Dock = DockStyle.Fill,
  16.  
    MenuHandler = new MenuHandler()
  17.  
    };
  18.  
    this.Controls.Add(webBrowser);
  19.  
     
  20.  
    webBrowser.FrameLoadEnd += WebBrowser_FrameLoadEnd;
  21.  
    webBrowser.RegisterAsyncJsObject("answerListForm", new JsEvent(this));
  22.  
    }
  23.  
     
  24.  
    private void WebBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
  25.  
    {
  26.  
    if (e.Frame.IsMain)
  27.  
    {
  28.  
    string answerMessage = JsonHelper.SerializeObject(Config.teacherSetAnswer);
  29.  
    webBrowser.ExecuteScriptAsync("getTeacherSetAnswer(" + answerMessage + ")");
  30.  
    }
  31.  
    }
  32.  
    /*
  33.  
    * ============================================================================================
  34.  
    * JS与调用c#
  35.  
    */
  36.  
    public class JsEvent
  37.  
    {
  38.  
    AnswerListForm form;
  39.  
    public JsEvent(AnswerListForm form)
  40.  
    {
  41.  
    this.form = form;
  42.  
    }
  43.  
     
  44.  
    public void test(string message)
  45.  
    {
  46.  
    if (form != null)
  47.  
    {
  48.  
    form.test(message);
  49.  
    }
  50.  
    }
  51.  
    }
  52.  
    }

3.1 加载本地html

加载本地文件格式:file:/// + 相对路径

3.2 去除鼠标右键事件

  1.  
    class MenuHandler : CefSharp.IContextMenuHandler
  2.  
    {
  3.  
    void CefSharp.IContextMenuHandler.OnBeforeContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model)
  4.  
    {
  5.  
    model.Clear();
  6.  
    }
  7.  
     
  8.  
    bool CefSharp.IContextMenuHandler.OnContextMenuCommand(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.CefMenuCommand commandId, CefSharp.CefEventFlags eventFlags)
  9.  
    {
  10.  
    //throw new NotImplementedException();
  11.  
    return false;
  12.  
    }
  13.  
     
  14.  
    void CefSharp.IContextMenuHandler.OnContextMenuDismissed(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame)
  15.  
    {
  16.  
    //throw new NotImplementedException();
  17.  
    }
  18.  
     
  19.  
    bool CefSharp.IContextMenuHandler.RunContextMenu(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, CefSharp.IFrame frame, CefSharp.IContextMenuParams parameters, CefSharp.IMenuModel model, CefSharp.IRunContextMenuCallback callback)
  20.  
    {
  21.  
    return false;
  22.  
    }
  23.  
    }
  •  

在初始化浏览器时,添加

  1.  
    webBrowser = new ChromiumWebBrowser(path)
  2.  
    {
  3.  
    MenuHandler = new MenuHandler()
  4.  
    };

3.3 c#调用js方法时机

  1.  
    webBrowser.FrameLoadEnd += WebBrowser_FrameLoadEnd;
  2.  
    private void WebBrowser_FrameLoadEnd(object sender, FrameLoadEndEventArgs e)
  3.  
    {
  4.  
    if (e.Frame.IsMain)
  5.  
    {
  6.  
    string answerMessage = JsonHelper.SerializeObject(Config.teacherSetAnswer);
  7.  
    webBrowser.ExecuteScriptAsync("getTeacherSetAnswer(" + answerMessage + ")");
  8.  
    }
  9.  
    }

监听WebBrowser_FrameLoadEnd事件,在其回调后才能调用js

3.4 js调用c#方法

  1.  
    webBrowser.RegisterAsyncJsObject("answerListForm", new JsEvent(this));
  2.  
     
  3.  
    public class JsEvent
  4.  
    {
  5.  
    AnswerListForm form;
  6.  
    public JsEvent(AnswerListForm form)
  7.  
    {
  8.  
    this.form = form;
  9.  
    }
  10.  
     
  11.  
    public void test(string message)
  12.  
    {
  13.  
    if (form != null)
  14.  
    {
  15.  
    form.test(message);
  16.  
    }
  17.  
    }
  18.  
    }

注入JsEvent对象,并添加注入标识符(answerListForm),在js的调用方式是:answerListForm.test(“king”);

4 CEF的一些坑

4.1 平台

目前CefSharp还不支持AnyCPU(貌似新版本开始支持:https://github.com/cefsharp/CefSharp/issues/1714),需要将你的项目设置为x86或x64

4.2 运行环境需求

  1. Microsoft .Net 4.5.2 or greater(4.5.2或以上)
  2. Microsoft Visual C++ Redistributable Package (either x86 or x64 depending on your application)(vc++运行库)

4.3 嵌套了ChromiumWebBrowser 的form关闭

建议使用webBrowser.GetBrowser().CloseBrowser(true);方式来关闭,而不直接调用form.Close()

posted @ 2022-01-20 17:03  China Soft  阅读(1216)  评论(0编辑  收藏  举报