在WPF中禁用WebBrowser上的上下文菜单

时间:2011-03-31 23:47:28

标签: c# .net wpf com-interop

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

过去几天我一直试图禁用该上下文菜单而没有太大成功。基本上我现在在的地方是:

  • 添加了对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; };
    

到目前为止,没有成功......任何想法?

提前致谢。

2 个答案:

答案 0 :(得分:7)

在文档正文标记中添加oncontextmenu属性对我有用。

<body oncontextmenu="return false;">

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

答案 1 :(得分:3)

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

预览事件在页面上较低,可用于拦截可能导致上下文菜单弹出的事件。

OnPreviewTouchDown

OnPreviewTouchMove

OnPreviewTouchUp