WinForms WebBrowser阻止ProcessCmdKey

时间:2011-05-03 09:37:16

标签: c# winforms browser key block

我有一个简单的 Windows Forms 应用程序,它只不过是包含Form的{​​{1}}。

我正在覆盖ProcessCmdKey方法,它运行正常。但是,虽然WebBrowser具有焦点,但WebBrowser仍然被调用,但是,它不再获取密钥代码。

ProcessCmdKey

2 个答案:

答案 0 :(得分:1)

你是否尝试重写WebBroswer的ProcessCmdKey ......我依稀回忆起浏览器在冒泡事件中做了一些时髦的事情......与安全性有关。是的,这是:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey.aspx说:

  

在消息预处理期间调用此方法来处理命令键。命令键是始终优先于常规输入键的键。命令键的示例包括加速器和菜单快捷方式。该方法必须返回true以指示它已处理命令键,或者false以指示该键不是命令键。仅当控件托管在Windows窗体应用程序中或作为ActiveX控件时才会调用此方法。

     

ProcessCmdKey方法首先确定控件是否具有ContextMenu,如果是,则启用ContextMenu来处理命令键。如果命令键不是菜单快捷方式且控件具有父级,则该键将传递给父级的ProcessCmdKey方法。实际效果是命令键在控制层次结构中“冒泡”。除了用户按下的键之外,键数据还指示与键同时按下哪些修改键(如果有的话)。修饰键包括SHIFT,CTRL和ALT键。

我认为它不会让你在表单级拦截浏览器密钥......我认为事件是由WebBrowser控件吃掉的。

干杯。基思。


编辑:

http://msdn.microsoft.com/en-us/library/system.windows.forms.keys.aspx说:

  

KeyCode用于从键值中提取密钥代码的位掩码。   修饰符用于从键值中提取修饰符的位掩码。

,该示例包含以下行:

if(e.KeyCode != Keys.Back)

if (Control.ModifierKeys == Keys.Shift) {

所以我猜你需要把那把钥匙旋转到它的组成部分。

答案 1 :(得分:1)

不幸的是,我无法从ProcessCmdKey + Lo / Hi单词中抓住 Ctrl + S 事件。

但是我可以从WebBrowser文件中找到它们:

WebBrowser browser = new WebBrowser();

...
browser.Document.Body.KeyDown += new HtmlElementEventHandler(Body_KeyDown);
...
private void Body_KeyDown(Object sender, HtmlElementEventArgs e)
{
    if(e.KeyPressedCode==83 && e.CtrlKeyPressed)
        MessageBox.Show("Give me some cookies");
}