网络浏览器';抢断';快捷键

本文关键字:快捷键 抢断 浏览器 网络 | 更新日期: 2023-09-27 18:21:30

问题:

我有一个WebBrowser,并且已经公开了它的ActiveX方法。在Web浏览器所在的窗体中,我有一个带有快捷键的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中键入/导航,否则表单的快捷方式可以工作。无论何时在控件外点击,都应从Web浏览器获取焦点,而不仅仅是在其他文本框处于焦点时(例如,在表单空白处点击。

网络浏览器';抢断';快捷键

尝试从WebBrowser控件继承并重写control.IsInputKey。查看Ctrl+N是否到达。

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

我们已经在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>

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

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

重写"PrecessCmdKey"方法并处理快捷方式。

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

如果不想在html代码中设置元标记,可以在导航URL之前将元标记分配给Web浏览器控件的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");