【问题标题】:Disable Context Menu in WebBrowser .NET CF 3.5在 WebBrowser .NET CF 3.5 中禁用上下文菜单
【发布时间】:2011-04-11 20:52:32
【问题描述】:

我将 .NET CF 3.5 中的 WebBrowser 控件用于 Windows CE 设备应用程序,出于安全原因需要禁用上下文菜单。我尝试了很多方法,但似乎都不适用于具有 .NET CF 3.5 的移动设备:

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

  2. 我尝试实现一个新的自定义透明控件以放置在 Web 浏览器上,类似于 this。

  3. 我尝试在 html 中编辑 OnContextMenu 元素,但不成功。

  4. 我已尝试覆盖 CreateParams 以在浏览器上创建一个透明的 PictureBox,这是here 的解决方案之一。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • woo 看起来像个笨蛋(我没有太多的 Windows 开发经验)。不过我会试一试!
    • 所以我已经将 WebBrowser 子类化为 Microsoft 的指南:msdn.microsoft.com/en-us/library/ms229669.aspx 我已经尝试取消 WM_NOTIFY 和 WM_CONTEXTMENU 消息,但似乎都不起作用。一旦我进入新的网络浏览器,什么都没有改变。似乎消息没有被正确拦截,因为在调试中从未调用处理程序。通知的签名整数值是否可能不同?我有 WM_NOTIFY 的 0x4E 和 WM_CONTEXTMENU 的 0x007B。
    • 所以通过子类化,我发现没有办法真正拦截和丢弃上下文菜单弹出。我的解决方案是挂接到 WM_CONTEXTMENU 消息中(与上面链接中挂接微软的 TreeView 消息类似),并在事件通过后立即弹出一个消息框。在用户能够放置任何焦点或单击它之前,MessageBox 会分散上下文菜单的注意力,从而为我提供了一个可接受的解决方案。谢谢!
    【解决方案2】:

    如果您觉得自己不足以负责托管的 WebBrowser,那么通过 P/Invoking 从 C# 中使用本机 HTML Control API(不是 IWebBrowser2 等)实际上并不难。

    如果你走那条路,那你也可以

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

    或

    • 通过向其发送带有 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 并在那里决定是否是否继续显示菜单或完全做其他事情。

    【讨论】:

    • 你知道网上有什么好的例子吗?我用谷歌搜索过,但我不完全确定 P/Invoking 需要什么。我现在真的不知道如何使用本机 HTML Control API。谢谢。
    • @John:您是指一般的 P/Invoking 示例还是在这种特定情况下执行它?对于一般情况,我认为msdn.microsoft.com/en-us/library/aa446536.aspx 是一个不错的介绍。在这种特定情况下,您需要在最简单的情况下 P/Invoke,在我的脑海中,只是本机 Win32 API 函数 CreateWindowEx(用于创建带有您选择的托管窗口作为父窗口的 HTML 控件)。
    • @John:我意识到您可能需要更多关于本机部分的指导,所以我添加了一个部分,请参阅编辑:
    • 感谢您的回复!幸运的是,我能够在不使用 P/Invoke 的情况下构建一个解决方法。不过,我肯定会使用此信息,我需要研究使用 P/Invoke 来禁用 SIP 选项菜单(在一个不相关的问题上)。再次感谢!
    【解决方案3】:

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

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

    【讨论】:

    • 如果您阅读了我对已接受答案的评论,您会发现您是对的,这些答案都不适合我,但我能够从其中一个答案中找到可接受的替代解决方案.您的解决方案仍然允许上下文菜单,这会使我担心的安全漏洞打开。感谢您的意见!
    【解决方案4】:

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

    【讨论】:

    • 不,它没有任何与上下文菜单相关的方法、变量或事件。
    【解决方案5】:

    我只是在寻找其他东西时遇到了this very interesting blog entry。我确实看起来它解决了上下文菜单问题(警告:我根本没有对此进行测试)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多