De forma predeterminada en Cefsharp, el cuadro de diálogo de impresión está habilitado para que los sitios web puedan interactuar con él usando window.print
. También puedes imprimir el contenido actual de la ventana simplemente haciendo clic derecho y seleccionando Imprimir en el menú desplegable. Hay varias razones por las que no te gustaría permitir esta característica en tu proyecto. Muchas aplicaciones que usan Chromium no permiten esta característica, por supuesto, al igual que Discord, Slack u otras.
En este artículo, te explicaré los conceptos básicos para bloquear la impresión en tu proyecto WinForms basado en Cefsharp.
1. Deshabilita o personaliza el menú contextual de Cefsharp
Como sabrás, al iniciar una instancia simple de Cefsharp, el menú contextual está habilitado por defecto y permite al usuario imprimir la página:
Es posible que también desees eliminar esto del menú contextual. Anteriormente escribimos 2 artículos diferentes sobre cómo eliminar o personalizar el menú contextual de Cefsharp:
- Cómo evitar que el menú contextual nativo aparezca en un control CefSharp en WinForms
- Cómo personalizar nuevos elementos en el menú contextual nativo en un control CefSharp en WinForms
Según tus necesidades, puedes optar por uno u otro.
2. Anular window.print
Ahora, si visitas una página que interactúa con la opción de imprimir el documento usando JavaScript window.print
, seguirá funcionando, por supuesto. Para eliminar esta posibilidad, debe sobrescribir el window.print
método en una función vacía. Por supuesto, puede hacer esto directamente en JavaScript, sin embargo, si está trabajando con varias páginas que pueden no incluir el mismo JavaScript, simplemente puede lograrlo a través de Cefsharp.
Simplemente agregue un método que se activará en el evento FrameLoadStart. La devolución de llamada simplemente ejecutará JavaScript simple cuando el marco esté listo, lo que básicamente anula el método window.print
con una función vacía que no debería dañar ningún código, el método no funcionará como de costumbre y eso es todo, la lógica debería ser la siguiente durante la inicialización:
// 1. Inicializar CefSettings
CefSettings settings = new CefSettings();
// Algunas configuraciones si las tiene, aquí
// Inicializar cef con la configuración proporcionada
Cef.Initialize(settings);
// 2. Crear un componente de navegador
ChromiumWebBrowser chromeBrowser = new ChromiumWebBrowser("www.somewebsite or file.com");
// 3. Asignar detector de eventos FrameLoadStart
chromeBrowser.FrameLoadStart += onFrameLoadStart;
// 4. Crear un oyente que inyecte JavaScript para evitar que una página web acceda al método window.print.
/// <summary>
/// Adjunte un oyente a cada frame que se inicie y elimine la función predeterminada de JavaScript window.print.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void onFrameLoadStart(object sender, FrameLoadStartEventArgs args)
{
args.Frame.ExecuteJavaScriptAsync("window.print = function(){};");
}
El siguiente código aplica la lógica mencionada en una única inicialización de Cefsharp en un solo formulario para que puedas implementarlo también en tu propio proyecto:
using System;
using System.Windows.Forms;
using CefSharp;
using CefSharp.WinForms;
namespace CefsharpSandbox
{
public partial class Form1 : Form
{
public ChromiumWebBrowser chromeBrowser;
public void InitializeChromium()
{
CefSettings settings = new CefSettings();
// Inicializar cef con la configuración proporcionada
Cef.Initialize(settings);
// Crear un componente de navegador
chromeBrowser = new ChromiumWebBrowser("https://ourcodeworld.com");
// Asignar detector de eventos FrameLoadStart
chromeBrowser.FrameLoadStart += onFrameLoadStart;
this.Controls.Add(chromeBrowser);
chromeBrowser.Dock = DockStyle.Fill;
}
public Form1()
{
InitializeComponent();
// Inicie el navegador después de inicializar el componente global
InitializeChromium();
}
/// <summary>
/// Adjunte un oyente a cada frame que se inicie y elimine la función predeterminada de JavaScript window.print.
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void onFrameLoadStart(object sender, FrameLoadStartEventArgs args)
{
args.Frame.ExecuteJavaScriptAsync("window.print = function(){};");
}
}
}
Que te diviertas ❤️!
Conviertete en un programador más sociable