个性化阅读
专注于IT技术分析

CefSharp ChromeDevToolsSystemMenu在当前上下文中不存在

当你尝试在Winforms应用程序的”图标”菜单的列表中显示”显示Chrome开发工具”选项时, 此错误很常见。

要解决此错误, 你需要创建此方法, 因为该方法在库中不存在。

我们的方法需要使用DLLImport方法, 因此我们需要添加一个引用来允许我们执行此操作, 并以你的形式导入以下组件:

using System.Runtime.InteropServices;

现在创建函数, 该函数将允许我们创建选项以在图标列表菜单中显示此选项:

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 for the Chrome dev tools item on the system menu
    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)
    {
        // in your form override the OnHandleCreated function and call this method e.g:
        // protected override void OnHandleCreated(EventArgs e)
        // {
        //     ChromeDevToolsSystemMenu.CreateSysMenu(frm, e);
        // }

        // Get a handle to a copy of this form's system (window) menu
        var hSysMenu = GetSystemMenu(frm.Handle, false);

        // Add a separator
        AppendMenu(hSysMenu, MF_SEPARATOR, 0, string.Empty);

        // Add the About menu item        // You can customize the message instead dev tools
        AppendMenu(hSysMenu, MF_STRING, SYSMENU_CHROME_DEV_TOOLS, "&Chrome Dev Tools");
    }
}

请注意, 此方法本身不会执行任何操作。我们需要对其进行初始化, 并过滤需要在类中重写的WndProc事件中的事件。使用以下方法重写类中的WndProc:

/// <summary>
///  Note that the <chromeBrowser> 
         
          variable needs to be replaced by your own instance of  ChromiumWebBrowser
/// </summary>
         
protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);

    // Test if the About item was selected from the system menu
    if ((m.Msg == ChromeDevToolsSystemMenu.WM_SYSCOMMAND) && ((int)m.WParam == ChromeDevToolsSystemMenu.SYSMENU_CHROME_DEV_TOOLS))
    {
        chromeBrowser.ShowDevTools();
    }
}

注意:请谨慎操作, 如摘要所示, 你需要为自己的ChromiumWebBrowser实例替换chromeBrowser变量。

最后, 你可以继续使用ChromeDevToolsSystemMenu方法, 而不会出现类错误。在类(窗体)的构造函数中启用它是一个好习惯:

public Form1()
{ 
   // Other methods as InitializeComponents and chromium
   InitializeComponent();
   InitializeChromium();

   // Enable the option in the icon list menu of the form
   ChromeDevToolsSystemMenu.CreateSysMenu(this);
}
赞(0)
未经允许不得转载:srcmini » CefSharp ChromeDevToolsSystemMenu在当前上下文中不存在

评论 抢沙发

评论前必须登录!