WebBrowser'抢断'快捷键

时间:2013-07-08 22:58:59

标签: c# winforms browser keyboard-shortcuts menustrip

问题:

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

我做了什么:

  1. 我尝试使用不起作用的计时器每隔100ms聚焦一次表格(这不是一个可行的选项,因为它不是很微妙,程序必须使用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
        }
    }
    
  4. 我想要实现的目标:

    1. 禁用了WebBrowser的快捷方式(我在某处看到ActiveX阻止了这个......为什么?)。

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

经过大量调查,我们发现它是浏览器兼容性问题。

我们在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代码中设置元标记,则可以在导航URL之前将元标记分配给webbrowser控件的Document文本属性。以下是样本。

    //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");