【问题标题】:CefSharp - no copy shortcut menu itemCefSharp - 没有复制快捷菜单项
【发布时间】:2017-03-25 16:57:41
【问题描述】:

我最近将 nuget 中的 cefsharp 添加到了 Visual Studio 的一个项目中。它适用于浏览,但我需要我的用户能够通过右键单击复制快捷方式从浏览器中复制他的电子邮件地址。

但 cefsharp 只显示 4 个选项 - 后退、前进、打印、查看源代码。没有复制快捷方式选项。

我没有使用任何设置初始化浏览器。刚刚创建了一个 chromiumbrowser 项并将其添加到表单上的控件中。

有人知道为什么会这样吗?我还尝试添加一个菜单项,但由于我不断收到错误消息而无法做到这一点 - “您必须使用新关键字”。浏览器中也没有可以通过代码调用的复制快捷方式。

有人可以帮助我并解释如何实现这一目标吗?如何为右键单击添加更多选项以及如何右键单击和复制链接地址。或者向我推荐一些其他浏览器组件?我尝试了 awesomium,但一半的网站无法加载。

【问题讨论】:

    标签: c# vb.net visual-studio-2010 chromium-embedded cefsharp


    【解决方案1】:

    您可以通过实现IContextMenuHandler 创建自己的上下文菜单。您没有具体说明您使用的是 WinForms 还是 WPF 版本,但 GitHub 上有大量示例。

    WinForms https://github.com/cefsharp/CefSharp/blob/master/CefSharp.WinForms.Example/Handlers/MenuHandler.cs

    WPF https://github.com/cefsharp/CefSharp/blob/master/CefSharp.Wpf.Example/Handlers/MenuHandler.cs

    对于任何一种风格,您都将您的 IContextMenuHandler 实现分配给 ChromiumWebBrowserMenuHandler 属性。在本例中,我遵循 GutHub WinForms 示例并在名为 MenuHandler 的类中实现 IContextMenuHandler。以下是WinForms 的示例,但可以轻松转换为WPF

    internal class MenuHandler : IContextMenuHandler
    {
        private const int Copy = 26503;
    
        void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
        {
            //Add new custom menu items
            model.AddItem((CefMenuCommand)Copy, "Copy Link Address");
        }
    
        bool IContextMenuHandler.OnContextMenuCommand(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)
        {
            if ((int)commandId == Copy)
            {
                //using System.Windows.Forms;
                Clipboard.SetText(parameters.SourceUrl);
            }
            return false;
        }
    
        void IContextMenuHandler.OnContextMenuDismissed(IWebBrowser browserControl, IBrowser browser, IFrame frame)
        {
    
        }
    
        bool IContextMenuHandler.RunContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)
        {
            return false;
        }
    }
    

    那么就只是给ChromiumWebBrowserMenuHandler属性赋值一个实例

    browser.MenuHandler = new MenuHandler();
    

    【讨论】:

    • 非常感谢。像魅力一样工作。应该搜索 github 但不知道如何浏览他们的部分。无论如何,对于其他人,我将 sourceurl 更改为 linkurl 因为这是我需要的。 parameters.LinkUrl 为我工作。
    • 啊,不确定是LinkUrl 还是SourceUrl,把它写在我的脑海里。很高兴它有帮助。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2021-01-28
    相关资源
    最近更新 更多