如何覆盖右键单击 WebView2 控件时出现的 ContextMenu?

use*_*067 4 .net webbrowser-control webview webview2

如何覆盖右键单击 WebView2 控件时出现的 ContextMenu?

当您右键单击 WebView2 控件时,会出现带有“刷新”、“另存为”等选项的标准上下文菜单。

如何让我自己的 ContextMenuStrip 出现而不是在鼠标右键单击期间出现?

Dav*_*ney 6

我们尚未完全支持自定义上下文菜单,但我们有一个跟踪它的功能请求。在此期间,您可以使用该功能请求问题中描述的解决方法来解决此问题。

本质上,解决方法是使用 document.body 的 contextmenu 事件来拦截通常的上下文菜单处理并实现您自己的。您可以使用将window.chrome.webview.postMessage上下文菜单事件发送到本机代码来创建本机上下文菜单,也可以在 HTML/JS 中实现上下文菜单。

抱歉,这不是一个简单的解决方案。如果您愿意,可以在功能请求中添加您自己的评论,让我们了解您在 WebView2 中使用上下文菜单的场景等。谢谢!


Pou*_*Bak 6

更新(现在代码在右键单击时显示您的上下文菜单,并在您单击任意位置时隐藏它):

您可以以下内容javascript注入您的网页(它订阅“ contextmenu”事件和“ mousedown”事件):

document.addEventListener('contextmenu', function (event)
{
    let jsonObject =
    {
        Key: 'contextmenu',
        Value:
        {
            X: event.screenX,
            Y: event.screenY
        }
    };
    window.chrome.webview.postMessage(jsonObject);
});

document.addEventListener('mousedown', function (event)
{
    let jsonObject =
    {
        Key: 'mousedown',
        Value:
        {
            X: event.screenX,
            Y: event.screenY
        }
    };
    window.chrome.webview.postMessage(jsonObject);
});
Run Code Online (Sandbox Code Playgroud)

将它保存在一个文件中是最简单的(我称之为“Javascript1.js”)。

要使用“CoreWebView2”实例,WebView2必须初始化控件,订阅“CoreWebView2InitializationCompleted”可以解决这个问题。

要注入您的 javascript,您可以从文件中加载它并用于AddScriptToExecuteOnDocumentCreatedAsync注入它。

您需要禁用默认上下文菜单。这是通过将AreDefaultContextMenusEnabled属性设置为false.

然后需要订阅WebMessageReceived事件并处理这两个事件。为此,请创建一个带有“键”和“值”的结构,以反序列化从 javascript 代码发送的 JSON 字符串。

显示带有事件的整个表单的C# 代码

using Newtonsoft.Json;
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        struct JsonObject
        {
            public string Key;
            public PointF Value;
        }

        private async void WebView21_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
        {
            webView21.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;
            string script = File.ReadAllText(Path.Combine(Environment.CurrentDirectory, @"Javascript1.js"));
            await webView21.CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync(script);
        }

        private void WebView21_WebMessageReceived(object sender, Microsoft.Web.WebView2.Core.CoreWebView2WebMessageReceivedEventArgs e)
        {
            JsonObject jsonObject = JsonConvert.DeserializeObject<JsonObject>(e.WebMessageAsJson);
            switch (jsonObject.Key)
            {
                case "contextmenu":
                    contextMenuStrip1.Show(Point.Truncate(jsonObject.Value));
                    break;
                case "mousedown":
                    contextMenuStrip1.Hide();
                    break;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @GarrGodfrey:我已经更新了答案以包含隐藏上下文菜单的代码。 (2认同)