【问题标题】:Disable Context Menu on WebBrowser in WPF [duplicate]在 WPF 中禁用 WebBrowser 上的上下文菜单 [重复]
【发布时间】:2023-03-15 08:21:01
【问题描述】:

我有一个 WPF 应用程序,它将在信息亭、带有触摸屏的 PC 上运行。该应用程序以全屏模式运行,以隐藏操作系统。在我的一个页面上,我有一个 WebBrowser 控件,允许用户查看一些网页(导航仅限于某些页面)。 由于计算机将放置在公共场所,因此我不能让用户访问操作系统。问题是,触摸屏允许在网络浏览器上单击鼠标右键,这最终导致任务栏出现......不好......!

过去几天我一直在尝试禁用该上下文菜单,但没有取得多大成功。基本上我现在的位置是:

  • 添加了对 SHDocVw.dll 的 COM 引用以获取 IWebBrowser2 接口(需要禁用新窗口的启动。

    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("6d5140c1-7436-11ce-8034-00aa006009fa")]
    internal interface IServiceProvider
    {
        [return: MarshalAs(UnmanagedType.IUnknown)]
        object QueryService(ref Guid guidService, ref Guid riid);
    }
    static readonly Guid SID_SWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046");
    
  • 获取 IWEBBrowser2 接口

                IServiceProvider _serviceProvider = null;
    
                if (_browser.Document != null)
                {
                    _serviceProvider = (IServiceProvider)_browser.Document;
    
                    Guid _serviceGuid = SID_SWebBrowserApp;
                    Guid _iid = typeof(SHDocVw.IWebBrowser2).GUID;
    
                    SHDocVw.IWebBrowser2 _webBrowser = (SHDocVw.IWebBrowser2)_serviceProvider.QueryService(ref _serviceGuid, ref _iid);
    
  • 并尝试禁用文档上的 oncontextmenu。

                    HTMLDocument doc = _webBrowser.Document as HTMLDocument;
                    mshtml.HTMLDocumentEvents2_Event ev = doc as mshtml.HTMLDocumentEvents2_Event;
    
                    ev.oncontextmenu += (arg) => { return false; };
    

到目前为止,没有成功...有什么想法吗?

提前致谢。

【问题讨论】:

标签: c# .net wpf com-interop


【解决方案1】:

向文档正文标签添加 oncontextmenu 属性对我有用。

<body oncontextmenu="return false;">

从这里的这篇文章。 http://social.msdn.microsoft.com/forums/en-US/wpf/thread/7c283faf-16c8-4b4e-a362-f292e3032abb/

【讨论】:

  • 这对我有用,因为我是创建网页的人。如果您无法控制用户在浏览器中查看的内容,这将不起作用。除非你能以某种方式操纵 DOM 并将该行添加到 body 元素中,然后它才会显示在 WebBrowser 控件中。
  • 如果您想从互联网加载页面,您可以尝试以下操作:使用 WebRequest 获取 html 页面,然后 -> yourHtml = yourHtml.Replace("
  • 如果我们有一个需要在某些情况下打开的网络应用程序嵌入在网络浏览器控件中。我们无法为 Web 应用禁用,但需要为嵌入式版本禁用
【解决方案2】:

你为什么不使用WPF WebBrowser control?它有许多 Touch 事件,您可以捕获和处理它们,并可能阻止 ContextMenu 弹出。或者您可以提供自己的 ContextMenu 供浏览器使用。

预览事件位于页面下方,可用于拦截会导致上下文菜单弹出的事件。

OnPreviewTouchDown

OnPreviewTouchMove

OnPreviewTouchUp

【讨论】:

  • 上下文菜单不是来自 WPF WebBrowser,所以我不能从这些事件中禁用它(实际上我只尝试了 OnPreviewMouse... 事件,但我应该得到相同的结果) .我可能会添加我自己的上下文菜单,也许它会使另一个消失。
  • 正如我所担心的那样,上下文菜单不属于 WPF WebBrowser,而是属于它包装的本机浏览器。它不是 WPF 上下文菜单。尝试添加或更改上下文菜单不会产生任何结果。我读到我可以从 Windows 注册表中禁用上下文菜单,尽管这有点矫枉过正......
  • 我认为禁用信息亭计算机上注册表中的上下文菜单并不过分。我认为这是个好主意。您越能锁定这台特定的 PC,效果就越好。
  • 奇怪的是,windows FORMS版本的浏览器控件有IsWebBrowserContextMenuEnabled="False" AllowWebBrowserDrop="False" WebBrowserShortcutsEnabled="False"的能力,而WPF版本不行?太奇怪了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
相关资源
最近更新 更多