首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何覆盖右键单击ContextMenu控件时出现的WebView2?

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

Stack Overflow用户
提问于 2020-06-28 15:09:41
回答 2查看 5.7K关注 0票数 5

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-04 17:05:39

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

您可以将以下javascript注入您的网页(它订阅'contextmenu‘事件和'mousedown’事件):

代码语言:javascript
运行
复制
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);
});

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

要使用'CoreWebView2‘实例,必须初始化WebView2控件,订阅'CoreWebView2InitializationCompleted’解决了这个问题。

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

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

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

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

代码语言:javascript
运行
复制
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 {get; set;}
            public PointF Value{get; set;}

        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 = JsonDeserializer.Deserialize<JsonObject>(e.WebMessageAsJson);
            switch (jsonObject.Key)
            {
                case "contextmenu":
                    contextMenuStrip1.Show(Point.Truncate(jsonObject.Value));
                    break;
                case "mousedown":
                    contextMenuStrip1.Hide();
                    break;
            }
        }
    }
}

高级版本可以在这里找到:覆盖Webview2上下文菜单和默认上下文菜单

票数 10
EN

Stack Overflow用户

发布于 2020-06-30 17:22:41

我们还没有完全支持定制上下文菜单,但是我们有跟踪它的特性请求。在过渡期间,您可能可以使用在该特性请求问题中所描述的工作来解决这个问题。

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

抱歉,这不是一个简单的解决办法。如果您愿意,可以将自己的注释添加到特性请求中,以便让我们了解在WebView2中使用上下文菜单的场景等等。谢谢!

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62624373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档