WinForms Web浏览器阻止ProcessCmdKey

t3irkdon  于 2023-03-13  发布在  其他
关注(0)|答案(3)|浏览(202)

我有一个简单的 *Windows窗体 * 应用程序,它只不过是一个包含WebBrowserForm
我重写了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;
}
swvgeqrz

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从键值中提取修饰符的位掩码。
并且该示例包含以下行:

if(e.KeyCode != Keys.Back)

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

所以我想你需要把这个键转成它的组成部分。

q1qsirdb

q1qsirdb2#

不幸的是,我无法从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");
}
bpsygsoo

bpsygsoo3#

在我的例子中,我希望处理F1键。
使用webbrowser控件的关键预览有助于:

webBrowserControl.PreviewKeyDown += OnWebBrowserPreviewKeyDown;

这样做并不需要覆盖webbrowser控件的ProcessCmdKey
但是这种方法不适用于Ctrl+S。

相关问题