我有一个简单的Windows Forms应用程序,无非就是包含FormWebBrowser

我覆盖了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;
}

最佳答案

您是否尝试覆盖WebBroswer的ProcessCmdKey ...我隐约记得浏览器在处理事件方面做得很时髦...与安全性有关。是的,这里是:

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


  在消息预处理期间调用此方法以处理命令键。命令键是始终优先于常规输入键的键。命令键的示例包括加速器和菜单快捷方式。该方法必须返回true表示已处理命令键,或者返回false表示该键不是命令键。仅当控件托管在Windows Forms应用程序中或作为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) {


因此,我想您需要将该密钥稍作改动,使其成为其组成部分。

10-01 19:34