【问题标题】:WebBrowser 'steals' shortcut keysWebBrowser“窃取”快捷键
【发布时间】:2013-07-08 22:58:58
【问题描述】:

问题:

我有一个 WebBrowser 并公开了它的 ActiveX 方法。在 WebBrowser 所在的表单中,我有一个带有快捷方式的 MainMenuStrip。只有当我在表单上的文本框中输入时,快捷方式才能正常工作。例如,当我按 CTRL + N 时,我的表单的快捷方式 - 而不是打开新的表单,WebBrowser 当前所在的页面会在 IE 中打开。

我的尝试:

  1. 我尝试使用不起作用的计时器每 100 毫秒聚焦一次表单(无论如何,这不是一个可行的选择,因为它不是很微妙,并且程序必须使用 SendKeys 等仔细导航 WebBrowser) .

  2. WebBrowser 的代码:

    this.webBrowser1.WebBrowserShortcutsEnabled = false;
    this.webBrowser1.AllowWebBrowserDrop = false;
    this.webBrowser1.IsWebBrowserContextMenuEnabled = false;
    
  3. 从 WebBrowser 继承并覆盖 ProcessCmdKey:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.N))
        {
            newToolStripMenuItem.PerformClick();
            return true; // or false
        }
    }
    

我想要达到的目标:

  1. WebBrowser 的快捷方式被禁用(我在某处读到 ActiveX 阻止了这种情况……为什么?)。

  2. 我想要的是,除非当前正在 WebBrowser 中键入/导航,否则表单的快捷方式可以工作。当在控件外点击时,应从 WebBrowser 获取焦点,而不仅仅是在其他文本框处于焦点时(例如,在表单的空白处点击时。

【问题讨论】:

  • 你能澄清一下公开它的 ActiveX 方法是什么意思吗?
  • @EvanHarper,我试一试:private SHDocVw.WebBrowser_V1 Web_V1; Web_V1 = (SHDocVw.WebBrowser_V1)webBrowser1.ActiveXInstance;至少那是代码。我不确定我是否完全理解它!
  • 代码真的任何与它所编造的 Web_V1 引用有关的事情吗?这是重要的部分。
  • 是的,我稍后使用它来获取您需要为其公开 ActiveXInterface 的 mshtml.Document,因为无法正常从 System.Windows.Forms.WebBrowser.HtmlDocument 转换为 mshtml.HTMLDocument。请说这是否不必要,因为它很不方便。
  • WebBrowser keyboard shortcuts 的可能重复项

标签: c# winforms browser keyboard-shortcuts menustrip


【解决方案1】:

尝试从 WebBrowser 控件继承并覆盖 Control.IsInputKey。看看 Ctrl+N 是否到达那里。

【讨论】:

    【解决方案2】:

    查了很多,才知道是浏览器兼容性问题。

    我们在 HTML 页面中添加了元标记,然后快捷方式可以正常工作。下面是示例代码。

    <html>
    <body>
    <Head>
    <meta http-equiv="X-UA-Compatible" content="IE=IE8" />
    </head>
    <form>
    First name:<br>
    <input type="text" name="firstname">
    <br>
    Last name:<br>
    <input type="text" name="lastname">
    </form></body>
    </html>
    

    这个问题有三种不同的解决方案。

    添加元标记使网站浏览器兼容。

    重写“PreocessCmdKey”方法并处理快捷方式。

    通过在 FEATURE_BROWSER_EMULATION 下添加密钥来模拟浏览器。

    如果您不想在 html 代码中设置 meta 标签,您可以在导航 URL 之前将 meta 标签分配给 webbrowser 控件的 Document text 属性。下面是示例。

        //Setting compatible mode of IE.
                        this.m_oWebBrowser.DocumentText = @"<html>
                          <head><meta http-equiv=""X-UA-Compatible"" content=""IE=IE8"" /> </head>
                          <body></body>
                          </html>";
    this.m_oWebBrowser.Navigate("www.google.com");
    

    【讨论】:

      猜你喜欢
      • 2013-04-26
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多