我有一个简单的 *Windows窗体 * 应用程序,它只不过是一个包含WebBrowser
的Form
。
我重写了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;
}
3条答案
按热度按时间swvgeqrz1#
你试过覆盖浏览器的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从键值中提取键码的位掩码。Modifiers从键值中提取修饰符的位掩码。
并且该示例包含以下行:
所以我想你需要把这个键转成它的组成部分。
q1qsirdb2#
不幸的是,我无法从
ProcessCmdKey
+ Lo/Hi字中捕获Ctrl+S事件。但我可以从
WebBrowser
文档中捕获它们:bpsygsoo3#
在我的例子中,我希望处理F1键。
使用webbrowser控件的关键预览有助于:
这样做并不需要覆盖webbrowser控件的
ProcessCmdKey
。但是这种方法不适用于Ctrl+S。