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

  • 相关阅读:
    ADB命令大全
    Backup your Android without root or custom recovery -- adb backup
    Content portal for Pocketables Tasker articles
    Is there a way to detect if call is in progress? Phone Event
    Tasker to proximity screen off
    Tasker to detect application running in background
    Tasker to create toggle widget for ES ftp service -- Send Intent
    Tasker to proximity screen on
    Tasker to answer incoming call by pressing power button
    Tasker to stop Poweramp control for the headset while there is an incoming SMS
  • 原文地址:https://www.cnblogs.com/chinasoft/p/15827130.html
Copyright © 2020-2023  润新知