如何隐藏CefSharp.WinForms.ChromiumWebBrowser的右键菜单?

29

我在我的项目中使用CefSharp.WinForms.ChromiumWebBrowser v45。当我右键单击浏览器时,将显示默认的上下文菜单:

dialog picture

但我不想展示任何东西。我该怎么办?

请展示一些研究的努力,并告诉我们你已经考虑过什么。 - Sebastian Walla
我希望我的软件用户不知道这个上下文菜单的存在。但是当他们在Web浏览器上选择一些文本并右键单击时,他们可以使用“复制”上下文菜单。我只禁用页面默认的右键上下文菜单。 - hubpan
5个回答

54

这是懒人们的实现方式,就像我一样。它基于CefSharp v53.0.0。

public class CustomMenuHandler : CefSharp.IContextMenuHandler 
{
    public void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
    {
        model.Clear();
    }

    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 browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)
    {
        return false;
    }
}

如何使用它

ChromiumWebBrowser browser = new ChromiumWebBrowser();
browser.MenuHandler = new CustomMenuHandler();

1
很好的想法 - 我想改进它
  1. 需要创建新的cs文件:CustomMenuHandler.cs
  2. 编写完整的CustomMenuHandler
  3. 保存它!
  4. chromeBrowser.menuHandler = new CustomMenuHandler();
仍然可以在v53.0.1上工作,太棒了!
- SourceSkyBoxer
在Cefsharp v63.0中,这对我也起作用,可以确保右键单击Chromium浏览器控件时不会出现默认上下文菜单。 - AndyUK
仍然适用于 CefSharp 93.1.140 - fviktor
在XAML中使用CustomMenuHandler:<wpf:ChromiumWebBrowser><wpf:ChromiumWebBrowser.MenuHandler><local:CustomMenuHandler /></wpf:ChromiumWebBrowser.MenuHandler></wpf:ChromiumWebBrowser> - Justas

6

最简单的方法是将 PreviewMouseRightButtonUp 和 PreviewMouseRightButtonDown 事件都设置为同一个函数,并使 e.Handle = true。这种解决方案可以防止右键单击时弹出 CefSharp 的上下文菜单。

XAML:

<wpf:ChromiumWebBrowser Grid.Row="1" x:Name="Browser" Margin="30,0" IsBrowserInitializedChanged="Browser_IsBrowserInitializedChanged" PreviewMouseRightButtonDown="Browser_PreviewMouseRightButton" PreviewMouseRightButtonUp="Browser_PreviewMouseRightButton"/>

而函数:

private void Browser_PreviewMouseRightButton(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;
}

请记住,上下文菜单仍然可以使用“Context”键盘按钮或Shift+F10打开。 - Justas

4
如果您实现了IContextMenuHandler,就可以控制ContextMenu。下面的两个链接演示了所需的内容(以及其他一些有用的功能)。 https://github.com/cefsharp/CefSharp/blob/935d3900ba2147f4786386596b62339087ff61b0/CefSharp.WinForms.Example/Handlers/MenuHandler.cs#L15 https://github.com/cefsharp/CefSharp/blob/c18f951a97a515df112d67775c767d4222f88c23/CefSharp.WinForms.Example/BrowserTabUserControl.cs#L31 一般来说,CefSharp.WinForms.Example项目演示了许多功能,如果您需要其他功能,请查看它。

3

你可以这样做...

ChromiumWebBrowser browser = new ChromiumWebBrowser();
browser.LoadingStateChanged += (sender, args) =>
{
    if (args.IsLoading == false)
    {
        _browser.ExecuteScriptAsync("document.oncontextmenu = function() { return false; };");
    }
};

我正在使用这个版本:
<package id="CefSharp.Wpf" version="78.3.10-CI3386" targetFramework="net48" />

1
webBrowser.PreviewMouseRightButtonDown += HandleWebBrowserPreviewMouseRightButton;
webBrowser.PreviewMouseRightButtonUp += HandleWebBrowserPreviewMouseRightButton;

private void HandleWebBrowserPreviewMouseRightButton(object sender, MouseButtonEventArgs e) {
            // Preventing right-click until https://github.com/cefsharp/CefSharp/issues/1915 is fixed
            e.Handled = true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接