Aprende a mostrar correctamente la opción "Mostrar herramientas de desarrollo de Chrome" en el menú de iconos sin tener este tedioso error.

CefSharp ChromeDevToolsSystemMenu no existe en el contexto actual

Este error es común cuando intenta mostrar la opción Mostrar herramientas de desarrollo de Chrome en la lista del menú de iconos en una aplicación winforms.

Para resolver este error, debe crear este método, ya que no existe en la biblioteca. 

Nuestro método necesita usar el método DLLImport, por lo tanto, necesitamos agregar una referencia que nos permita hacer esto, importe el siguiente componente en su formulario:

using System.Runtime.InteropServices;

Ahora cree la función que nos permitirá crear la opción para que aparezca esta opción en el menú de la lista de iconos:

private static class ChromeDevToolsSystemMenu
{
    // P/Invoke constants
    public const int WM_SYSCOMMAND = 0x112;

    private const int MF_STRING = 0x0;
    private const int MF_SEPARATOR = 0x800;

    // ID del elemento de herramientas de desarrollo de Chrome en el menú del sistema
    public const int SYSMENU_CHROME_DEV_TOOLS = 0x1;

    // P/Invoke declarations
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern bool AppendMenu(IntPtr hMenu, int uFlags, int uIDNewItem, string lpNewItem);

    public static void CreateSysMenu(Form frm)
    {
        // en su formulario anule la función OnHandleCreated y llame a este método, por ejemplo:
        // protected override void OnHandleCreated(EventArgs e)
        // {
        //     ChromeDevToolsSystemMenu.CreateSysMenu(frm,e);
        // }

        // Obtenga un identificador para una copia del menú del sistema (ventana) de este formulario
        var hSysMenu = GetSystemMenu(frm.Handle, false);

        // Agregar un separador
        AppendMenu(hSysMenu, MF_SEPARATOR, 0, string.Empty);

         // Agregar el elemento de menú Acerca de
         // Puedes personalizar el mensaje en lugar de las herramientas de desarrollo
        AppendMenu(hSysMenu, MF_STRING, SYSMENU_CHROME_DEV_TOOLS, "&Chrome Dev Tools");
    }
}

Tenga en cuenta que este método no hace nada por sí solo. Necesitamos inicializarlo y filtrar los eventos en  WndProccaso de que necesitemos anular en nuestra clase. Reemplace el WndProc en la clase usando el siguiente método:

/// <summary>
///  Tenga en cuenta que la variable <chromeBrowser> debe ser reemplazada por su propia instancia de ChromiumWebBrowser
/// </summary>
protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    // Pruebe si se seleccionó el elemento Acerca de en el menú del sistema
    if ((m.Msg == ChromeDevToolsSystemMenu.WM_SYSCOMMAND) && ((int)m.WParam == ChromeDevToolsSystemMenu.SYSMENU_CHROME_DEV_TOOLS))
    {
        chromeBrowser.ShowDevTools();
    }
}

Nota: Tenga cuidado, ya que necesita reemplazar la  chromeBrowservariable por su propia instancia de ChromiumWebBrowsercomo dice el resumen.

Finalmente, puede proceder a usar el método ChromeDevToolsSystemMenu sin errores en su clase. Es una buena práctica habilitarlo en el constructor de su clase (formulario):

public Form1()
{ 
   // Otros métodos como InitializeComponents y chromium
   InitializeComponent();
   InitializeChromium();

   // Habilita la opción en el menú de la lista de iconos del formulario
   ChromeDevToolsSystemMenu.CreateSysMenu(this);
}

Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores