Implementación de CefSharp con Chromium en Aplicaciones WinForms

  1. Crear nuevo proyecto WinForms con .NET Framework 4.8 =======================================================

El primer paso consiste en generar un nuevo proyecto de tipo Windows Forms Application utilizando .NET Framework 4.8 como plataforma de destino.

  1. Instalar CefSharp.WinForms mediante NuGet ============================================

Se debe agregar el paquete CefSharp.WinForms en su versión 84.4.10 a través del administrador de paquetes NuGet. Esta versión es estable y compatible con la configuración requerida.

  1. Configurar modo de deupración a x86 ======================================

Importante: Modificar la configuración de compilación en modo depuración (Debug) hacia la plataforma x86, ya que CefSharp requiere esta arquitectura para funcionar corrrectamente.

  1. Inicializar el navegador ===========================
#region Inicialización del navegador
/// <summary>
/// Inicializa el componente navegador Chromium embebido
/// </summary>
private void InicializarNavegador()
{
    CefSettings configuracion = new CefSettings();

    configuracion.CefCommandLineArgs.Add("--ignore-urlfetcher-cert-requests", "1");
    configuracion.CefCommandLineArgs.Add("--ignore-certificate-errors", "1");
    configuracion.CefCommandLineArgs.Add("disable-usb-keyboard-detect", "1");
    configuracion.CefCommandLineArgs.Add("enable-media-stream", "1");
    configuracion.CefCommandLineArgs.Add("no-proxy-server", "1");
    configuracion.CefCommandLineArgs.Add("enable-speech-input", "1");
    configuracion.CefCommandLineArgs.Add("touch-events", "1");
    configuracion.CefCommandLineArgs.Add("unsafely-treat-insecure-origin-as-secure", "https://txtrtc.sstms.net");
    
    CefSharpSettings.WcfEnabled = true;

    Cef.Initialize(configuracion);
    navegadorChrome = new ChromiumWebBrowser(url);
    navegadorChrome.LifeSpanHandler = new AbrirPaginaMismaVentana();
    navegadorChrome.FocusHandler = null;

    this.Controls.Add(navegadorChrome);
    navegadorChrome.Dock = DockStyle.Fill;
    navegadorChrome.KeyboardHandler = new ManejadorTecladoCEF();
    navegadorChrome.RequestHandler = new ManejadorSolicitudes();
    navegadorChrome.MenuHandler = new ManejadorMenu();
}

#endregion

  1. Configuracinoes adicionales ==============================

Manejo de teclado y herramientas de desarrollo

    #region Depuración
    public class ManejadorTecladoCEF : IKeyboardHandler
    {
        public bool OnKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey)
        {
            if (type == KeyType.KeyUp && Enum.IsDefined(typeof(Keys), windowsKeyCode))
            {
                var tecla = (Keys)windowsKeyCode;
                switch (tecla)
                {
                    case Keys.F12:
                        browser.ShowDevTools();
                        break;
                    case Keys.F5:
                        if (modifiers == CefEventFlags.ControlDown)
                        {
                            browser.Reload(true);
                        }
                        else
                        {
                            browser.Reload();
                        }
                        break;
                }
            }
            return false;
        }

        public bool OnPreKeyEvent(IWebBrowser browserControl, IBrowser browser, KeyType type, int windowsKeyCode, int nativeKeyCode, CefEventFlags modifiers, bool isSystemKey, ref bool isKeyboardShortcut)
        {
            return false;
        }
    }
    #endregion

    #region Apertura de ventanas en la ventana actual
    internal class AbrirPaginaMismaVentana : ILifeSpanHandler
    {
        public bool DoClose(IWebBrowser browserControl, IBrowser browser)
        {
            return false;
        }

        public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser)
        {
        }

        public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser)
        {
        }

        public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl,
string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures,
IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
        {
            string abrirNuevaVentana = Utilidades.ObtenerParametroUrl("newWinOpen", targetUrl);
            var navegador = (ChromiumWebBrowser)browserControl;

            if (abrirNuevaVentana == "1")
            {
                newBrowser = new ChromiumWebBrowser();
                return false;
            }
            newBrowser = null;
            navegador.Load(targetUrl);
            return true;
        }
    }
    #endregion

    #region Manejo de certificados SSL
    /// <summary>
    /// Manejo de excepciones de certificados
    /// </summary>
    public class ManejadorSolicitudes : RequestHandler
    {
        protected override bool OnCertificateError(IWebBrowser chromiumWebBrowser, IBrowser browser, CefErrorCode errorCode, string requestUrl, ISslInfo sslInfo, IRequestCallback callback)
        {
            Task.Run(() =>
            {
                if (!callback.IsDisposed)
                {
                    using (callback)
                    {
                        if (requestUrl.Contains("reportSystem"))
                        {
                            callback.Continue(true);
                        }
                        else
                        {
                            callback.Continue(false);
                        }
                    }
                }
            });
            return true;
        }
    }
    #endregion

    #region Deshabilitar menú contextual
    /// <summary>
    /// Deshabilita el menú del botón derecho
    /// </summary>
    internal class ManejadorMenu : IContextMenuHandler
    {
        public bool OnBeforeContextMenu(IWebBrowser browser, IBrowser ibrower, IFrame iframe, IContextMenuParams icontextmenuparams, IMenuModel imenumodel)
        {
            return false;
        }

        public bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)
        {
            return false;
        }

        public void OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)
        {
        }

        public bool RunContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)
        {
            return false;
        }

        void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
        {
            model.Clear();
        }
    }
    #endregion

Etiquetas: cefsharp WinForms chromium CSharp .NET

Publicado el 8-2 21:16