zoukankan      html  css  js  c++  java
  • C# 使用CefSharp嵌入网站

      最近有一个项目,需要在winform中嵌套web网站,从网上了解到几个相关的组件有winform自带的IE内核的WebBrowser,有第三方组件谷歌内核的webkit、cefsharp、chromiumfx等。

      开始为了方便使用WebBrowser,发现有些css样式和js无效(毕竟是ie内核,可以理解),接着用webkit发现有些css和js同样是无效,后来在网上搜索一番,发现cefsharp口碑相对不错,那么就用它了。

      其中在使用过程中也是遇到了不少坑,最为典型的就是加载网页特别慢,不过后来也得到了解决办法,本文中会有提到。

    一、首先创建个winform程序。

    二、使用NuGet包导入CefSharp.WinForms

    三、在前台拖动一个Panel容器,用于显示网站。

    四、开始编写后台代码,需要添加

    using CefSharp;
    using CefSharp.WinForms;
    using System;
    using System.Windows.Forms;
    
    namespace CefSharpDemo
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                InitBrowser();
            }
    
            public ChromiumWebBrowser browser;
            public void InitBrowser()
            {
                try
                {
                    Cef.Initialize(new CefSettings());  
    
                    browser = new ChromiumWebBrowser("http://www.baidu.com");
                    browser.Parent = panel1;
                    browser.Dock = DockStyle.Fill;
                    browser.FrameLoadEnd += new EventHandler<FrameLoadEndEventArgs>(FrameEndFunc); 
                }
                catch (Exception ex)
                {
    
                }
            }
    
            private void FrameEndFunc(object sender, FrameLoadEndEventArgs e)
            {
                //下面替换成你要调用html JS 方法的算法过程。 其中EvaluateScriptAsync为调用JS的方法
    
                //string data = "参数";
                //string info = "test0624()"; //我的JS 方法是initValue
                //this.browser.EvaluateScriptAsync(info); 
            }
        }
    }

    这时,你生成项目会发现报错。

    看到错误日志我们就明白了,需要把生成改为x86或者x64位,这里我改为x86。

    再次运行就ok了,但是你还会发现加载网页为什么这么慢呢?

    五、解决CefSharp嵌入网站加载过慢的问题。

      定位后发现很多是因为设置系统代理所致,此时可以通过如下启动参数禁止系统代理。

    {"proxy-auto-detect", "0"},
    {"no-proxy-server", "1"},

      我们把这配置参数加载启动进程Program里,代码如下:

    using CefSharp;
    using CefSharp.WinForms;
    using System;
    using System.IO;
    using System.Windows.Forms;
    
    namespace CefSharpDemo
    {
        static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                /*配置浏览器属性*/
                var settings = new CefSettings()
                {
                    Locale = "zh-CN",
                    CachePath = Directory.GetCurrentDirectory() + @"Cache"
                };
    
                settings.CefCommandLineArgs.Add("proxy-auto-detect", "0");
                settings.CefCommandLineArgs.Add("no-proxy-server", "1");
                /*初始化配置*/
                Cef.Initialize(settings);
    
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }
    }

      运行查看:

      切记:需要注释掉其他 new CefSettings(),否则会报错,无法加载网站(注释掉本案例中Form1中的 "Cef.Initialize(new CefSettings());" ),原因是:每个进程只能初始化一次CEF。这是底层CEF/Chromium框架的一个限制。

      本想着附带源码放在百度云盘上,后来发现目标文件太大了(300+M),代码倒是没几行,主要是CefSharp的组件容量大,如果程序哪里有问题,大家可以留言或者拍砖。

  • 相关阅读:
    Linux/UNIX编程:实现简单 tee 命令
    Java原子变量类需要注意的问题
    一种很有意思的数据结构:Bitmap
    Java实现简单井字棋
    分治算法学习
    使用栈实现表达式求值
    Web安全学习笔记——SQL注入
    【old】Python学习笔记
    函数1
    pycharm(Tip of Day)
  • 原文地址:https://www.cnblogs.com/swjian/p/11275271.html
Copyright © 2011-2022 走看看