在WebBrowser .NET CF 3.5中禁用上下文菜单

时间:2011-04-11 20:52:33

标签: c# windows-mobile webbrowser-control windows-ce .net-cf-3.5

我在.NET CF 3.5中使用WebBrowser控件用于Windows CE设备应用程序,出于安全考虑,需要禁用上下文菜单。我尝试过各种各样的东西,但这些东西似乎都不适用于使用.NET CF 3.5的移动设备:

  1. 我尝试将一个pictureBox放在WebBrowser上,并将其设置为透明。不幸的是,透明度不起作用,这最终成为我浏览器上的白盒子。

  2. 我尝试将新的自定义透明控件放在网页浏览器上,类似于this

  3. 我已经尝试在html中编辑OnContextMenu元素,没有运气。

  4. 我尝试重写CreateParams,在浏览器上创建一个透明的PictureBox,作为解决方案之一here

  5. 网上似乎有很多解决方案,但它们似乎都不适用于使用.NET CF 3.5的Windows CE。我相信这是因为WebBrowser的实现比完整的.NET 3.5简单得多。所以我的问题是:有没有办法禁用WebBrowser控件的上下文菜单?

5 个答案:

答案 0 :(得分:1)

我没有尝试过这个特定的控件,所以我不知道它是否会起作用,但是你试过subclassing the browser control并拦截和丢弃导致上下文菜单出现在第一个中的消息地点?如果我必须解决同样的问题,这肯定是我先尝试的。

答案 1 :(得分:1)

如果您觉得自己不够负责管理WebBrowser,那么使用P /从C#调用本机HTML Control API(不是IWebBrowser2等)实际上并不难。

如果你这样做,那么你可以

  • 拦截上下文菜单通知NM_CONTEXTMENU,当上下文菜单即将显示时,该通知将被发送到HTML控件主机/父级,并且不允许它继续使用默认的窗口消息处理程序

  • 通过向FISSE发送DTM_ENABLECONTEXTMENU来完全禁用上下文菜单。

去过那里,做到了,两者都有效。

修改

在这种情况下,有三种可能的复杂程度:

  1. 除非使用窗口样式HS_CONTEXTMENU创建HTML控件,否则默认情况下将禁用上下文菜单。因此,如果你想做的就是禁用它,那么本机CreateWindowEx是P / Invoke唯一需要的原生Win32 API函数。
  2. 另一方面,如果您执行想要在运行时启用和禁用上下文菜单,则可以使用DTM_ENABLECONTEXTMENU和TRUE / FALSE P / Invoke SendMessage。
  3. 最后,如果你想要最大程度地控制菜单或者在HTML控件想要显示菜单时做一些完全随意的事情,你需要P / Invoke SetWindowLong来继承父级并听取NM_CONTEXTMENU并决定是否要继续显示菜单或不做其他事情。

答案 2 :(得分:1)

这些可能的答案都不起作用。所以我放弃了尝试隐藏上下文菜单,只是为Navigating事件添加了一个事件处理程序,如果它与我最初发送给它的URL不同,则取消导航。它仍然显示上下文菜单,但点击任何内容都不会将其发送到另一个页面

void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
    //don't let users go anywhere else
    if (e.Url != webBrowser1.Url) {
        e.Cancel = true;
    }
}

答案 3 :(得分:0)

Web CFrow中的WebBrowser控件实现是否不包含属性IsWebBrowserContextMenuEnabled

答案 4 :(得分:0)

我在寻找其他东西时遇到了this very interesting blog entry。我确定看起来它解决了上下文菜单问题(警告:我根本没有测试过这个)。