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()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM