使用cefsharp在winform中嵌套浏览器,解决程序闪退问题,你也可以做一个红芯浏览器^v^

使用cefsharp在winform中嵌套浏览器

简单使用cefsharp在winform中嵌套浏览器

在上一节,我们学习了如何简单地在winform中嵌入chromium浏览器,我在使用这个开发项目时,需要点击一个按钮,弹出嵌入浏览器的窗体,出现一个问题,就是第一次点击按钮可以正常打开浏览器,第二次点击就会出现卡壳,闪退问题。由于对于chromium这个庞大的程序不太了解,上网搜索相关文章解决了该问题:
就是在嵌入浏览器的窗体类中不能用Cef.shutdown();需要在调用的主窗体中才能调用Cef.shutdown();,贴一下代码吧:

主窗体代码:点击按钮会弹出嵌有浏览器的窗体
using CefSharp;
using System;
using System.Windows.Forms;

namespace SecondApp
{
    public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FrmSecond frmSecond = new FrmSecond();
            frmSecond.Show();
        }
        //在这最后是否Cef
        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            Cef.Shutdown();
            Environment.Exit(0);
        }
    }
}

//嵌入浏览器的窗体:
using CefSharp;
using CefSharp.WinForms;
using System;
using System.Windows.Forms;

namespace SecondApp
{
    public partial class FrmSecond : Form
    {
        public ChromiumWebBrowser chromeBrowser;
        public FrmSecond()
        {
            InitializeComponent();
        }
        private void FrmSecond_Load(object sender, EventArgs e)
        {
            // 创建浏览器控件
            chromeBrowser = new ChromiumWebBrowser("https://blog.csdn.net/xingkongtianyuzhao");
            // 将控件添加到窗体
            this.Controls.Add(chromeBrowser);
            chromeBrowser.Dock = DockStyle.Fill;
        }
        //初始化浏览器并启动
        public void InitializeChromium()
        {
            try
            {
                CefSettings settings = new CefSettings();
                // 设置是否使用GPU
                settings.CefCommandLineArgs.Add("disable-gpu", "1");
                // 设置是否使用代理服务
                settings.CefCommandLineArgs.Add("no-proxy-server", "1");
                // 设置是否启动js交互,假如需要原生与js方法互调,则需要设置为true
                CefSharpSettings.LegacyJavascriptBindingEnabled = true;
                // 初始化cef
                Cef.Initialize(settings, true, browserProcessHandler: null);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        //窗口关闭
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            chromeBrowser.CloseDevTools();//关闭浏览器调试工具
            //此方法会同时关闭窗口,我们真只可以直接调用该方法,同时关闭浏览器及窗口
            chromeBrowser.GetBrowser().CloseBrowser(true);//关闭浏览器
            //释放浏览器对象
            if (chromeBrowser != null && !chromeBrowser.Disposing)
            {
                chromeBrowser.Dispose();
            }
        }
    }
}

具体源码参考:

https://gitee.com/Alexander360/LearnCefsharp

原文地址:https://www.cnblogs.com/AlexanderZhao/p/12217102.html

时间: 2024-10-29 16:41:37