2011-05-03 66 views
2

我有一个简单的Windows窗体应用程序,只不过是Form包含WebBrowserWinForms WebBrowser blocking ProcessCmdKey

我重写了ProcessCmdKey方法,它工作正常。但是,虽然WebBrowser是重点,但ProcessCmdKey仍然被称为,但是,它不再拿起关键代码。

protected override bool ProcessCmdKey(ref Message msg, Keys keyData){ 

    //When webbrowser has focus, only control or S are found - not both. 
    if(keyData==(Keys.Control|Keys.S)){ 
     //Do things here. 
     return true; 
    } 

    return false; 
} 
+0

你尝试覆盖在WebBroswer ...我依稀记得浏览器做了时髦与bubbing机事件...到做与安全。是的 – corlettk 2011-05-03 09:47:05

+0

这是ActiveX托管协议的副作用。 IOleControlSite :: TranslateAccelerator()。 Ctrl + S是Internet Explorer的快捷键。你可以做的事情不多。 – 2011-05-03 23:41:22

回答

1

你尝试重写WebBroswer的ProcessCmdKey ......我依稀记得浏览器不会与bubbing向上事件时髦的东西...做的安全性。是的,这就是:

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说:

邀请码位掩码从键值提取键代码。 修饰符用于从键值中提取修饰符的位掩码。

和示例包含线路:

if(e.KeyCode != Keys.Back) 

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

所以我猜你需要位摆弄那个键进入它的组成部分。

+0

嗨基思,谢谢你的回答,虽然我不能说我完全理解。我已经尝试覆盖WebBrowser的ProcessCmdKey,并返回true或false,但是没有做任何事情,尽管我在您提供的MSDN链接中似乎_Do不使用此枚举中的值进行组合按位操作。枚举中的值不是相互排斥的。我怎样才能解决这个问题? – R4D4 2011-05-03 10:10:19

+0

Geez dude,RTFM!直接在该警告之上:Keys类包含用于处理键盘输入的常量。 Keys枚举的成员由一个键码和一组修饰符组成一个整数值。在Win32应用程序编程接口(API)中,键值有两半,高位包含键代码(与Windows虚拟键代码相同),低位代表键控修饰符,如SHIFT,CONTROL和ALT键。 – corlettk 2011-05-03 10:18:01

+0

我明白,有两部分,但我不明白我如何可以提取上部和下部的部分,示例'if(Control.ModifierKeys == Keys.Shift){'似乎相当无用 - 我没有KeyEventArgs目的。 – R4D4 2011-05-03 10:37:03

1

Unfortunaley我无法从ProcessCmdKey +高/低的话赶按Ctrl +小号事件

但我可以从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"); 
}