问题:
我有一个WebBrowser并公开了它的ActiveX方法。在我的WebBrowser所在的表单中,我有一个带有快捷方式的MainMenuStrip。只有当我在表单上的文本框中键入时,快捷方式才能正常工作。例如,当我按下CTRL + N,我的表单的快捷方式 - 而不是新的表单打开时,WebBrowser当前所在的页面将在IE中打开。
我做了什么:
我尝试使用不起作用的计时器每隔100ms聚焦一次表格(这不是一个可行的选项,因为它不是很微妙,程序必须使用SendKeys等仔细导航WebBrowser)
WebBrowser代码:
this.webBrowser1.WebBrowserShortcutsEnabled = false;
this.webBrowser1.AllowWebBrowserDrop = false;
this.webBrowser1.IsWebBrowserContextMenuEnabled = false;
继承WebBrowser并重写ProcessCmdKey:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.Control | Keys.N))
{
newToolStripMenuItem.PerformClick();
return true; // or false
}
}
我想要实现的目标:
禁用了WebBrowser的快捷方式(我在某处看到ActiveX阻止了这个......为什么?)。
我想要的是,除非当前正在WebBrowser中键入/导航,否则表单的快捷方式有效。应该从WebBrowser获取焦点WHEREEVER控件外部有一个点击,而不仅仅是当其他文本框处于焦点时(例如,当表单的空白处有一个点击时。
答案 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");