- 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.
- 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.
- 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.
- 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
- 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