禁用WebBrowser . net CF 3.5中的上下文菜单

本文关键字:上下文 菜单 WebBrowser net CF 禁用 | 更新日期: 2023-09-27 17:49:39

我正在使用。net CF 3.5中的WebBrowser控件用于Windows CE设备应用程序,出于安全原因需要禁用上下文菜单。我尝试了各种各样的东西,似乎没有一个适合使用。net CF 3.5的移动设备:

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

  2. 我已经尝试实现一个新的自定义透明控件放置在web浏览器上,类似于此

  3. 我试过在html中编辑OnContextMenu元素,没有运气

  4. 我已经尝试重写CreateParams使一个透明的图片框在浏览器上,注意作为一个解决方案在这里。

网上似乎有很多解决方案,但似乎没有一个适用于windows CE和。net CF 3.5。我相信这是因为WebBrowser的实现比完整的。net 3.5要简单得多。所以我的问题是:有没有办法禁用上下文菜单的WebBrowser控件?

禁用WebBrowser . net CF 3.5中的上下文菜单

我没有尝试过这个特定的控件,所以我不知道它是否会起作用,但是您是否尝试过子类化浏览器控件并拦截和丢弃导致上下文菜单出现在首位的消息?如果我必须解决同样的问题,我当然会首先尝试这样做。

如果你觉得你对托管的WebBrowser不够负责,那么通过从c#调用它来使用本地HTML控件API(不是IWebBrowser2等)实际上并不难。

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

  • 拦截上下文菜单通知NM_CONTEXTMENU,当上下文菜单即将显示时,它被发送到HTML控制主机/父节点,而不是让它继续到默认的窗口消息处理程序

  • 通过发送带有FALSE的DTM_ENABLECONTEXTMENU来完全禁用上下文菜单。

有过,有过,都可以。

编辑:

在这种情况下有3种可能的复杂性级别:

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

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

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

.NET CF中的WebBrowser控件实现不包含属性IsWebBrowserContextMenuEnabled吗?

我在寻找其他东西的时候偶然发现了这个非常有趣的博客条目。我确信它解决了上下文菜单问题(警告:我没有测试过这个)。