You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF WebView2控件右键菜单禁用方案咨询(Win10/VS2019/WPF Core)

解决WebView2禁用右键菜单的C#方案

我之前在WPF Core里用WebView2的时候也遇到过一模一样的问题,给你几个亲测有效的C#解决方案:

方案一:使用CoreWebView2Settings官方属性(优先推荐)

首先要注意,AreDefaultContextMenusEnabled属性需要在WebView2的CoreWebView2初始化完成后才能访问,而且要确保你的Microsoft.Web.WebView2 NuGet包版本足够新(如果VS2019识别不了,先把包更新到兼容VS2019的最新稳定版)。

代码示例:

private async void WebView2_Loaded(object sender, RoutedEventArgs e)
{
    // 确保CoreWebView2初始化完成
    await webView2.EnsureCoreWebView2Async(null);
    // 禁用默认右键菜单
    webView2.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false;
}

原理:这是WebView2官方提供的原生设置,直接禁用控件自带的默认右键菜单,同时也会阻止网页的右键菜单触发(只要网页没有刻意绕过)。

方案二:全局注入JavaScript拦截右键事件

如果方案一因为版本或某些特殊页面不生效,就用注入JS的方式,全局拦截所有右键事件,不管页面怎么动态加载内容都能生效:

代码示例:

private async void WebView2_CoreWebView2InitializationCompleted(object sender, CoreWebView2InitializationCompletedEventArgs e)
{
    if (e.IsSuccess)
    {
        // 每次页面导航完成后注入脚本
        webView2.CoreWebView2.NavigationCompleted += CoreWebView2_NavigationCompleted;
    }
}

private async void CoreWebView2_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e)
{
    if (e.IsSuccess)
    {
        await webView2.CoreWebView2.ExecuteScriptAsync(@"
            // 在捕获阶段拦截全局右键事件,优先级最高
            document.addEventListener('contextmenu', function(e) {
                e.preventDefault();
                e.stopPropagation();
            }, true);
        ");
    }
}

原理:通过addEventListener的第三个参数true,让事件在捕获阶段就被拦截,这样就算网页自身有右键事件处理逻辑,也会被这个全局拦截先阻止,比给<body>加oncontextmenu属性更可靠。

方案三:兼容iframe页面的右键拦截

如果你的WebView2里会加载包含iframe的页面,上面的脚本可能覆盖不到iframe内容,这时候可以扩展脚本,处理主文档和iframe的右键事件:

代码示例:

private async void CoreWebView2_NavigationCompleted(object sender, CoreWebView2NavigationCompletedEventArgs e)
{
    if (e.IsSuccess)
    {
        await webView2.CoreWebView2.ExecuteScriptAsync(@"
            // 拦截主文档右键
            document.addEventListener('contextmenu', e => {
                e.preventDefault();
                e.stopPropagation();
            }, true);

            // 处理现有iframe
            function setupIframeContextMenuBlock(iframe) {
                try {
                    iframe.contentDocument.addEventListener('contextmenu', e => {
                        e.preventDefault();
                        e.stopPropagation();
                    }, true);
                } catch (ex) {
                    // 跨域iframe无法访问,忽略错误
                }
            }

            document.querySelectorAll('iframe').forEach(setupIframeContextMenuBlock);

            // 监听动态添加的iframe
            const observer = new MutationObserver(mutations => {
                mutations.forEach(mutation => {
                    mutation.addedNodes.forEach(node => {
                        if (node.tagName === 'IFRAME') {
                            setTimeout(() => setupIframeContextMenuBlock(node), 100);
                        }
                    });
                });
            });
            observer.observe(document.body, { childList: true, subtree: true });
        ");
    }
}

原理:这个脚本不仅处理主文档,还会遍历现有iframe并拦截右键,同时用MutationObserver监听DOM变化,处理动态新增的iframe。跨域的iframe因为同源策略限制无法访问,所以加了try-catch忽略错误,不影响其他功能。


内容的提问来源于stack exchange,提问作者nam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:37:39