【问题标题】:Handling key events on WebBrowser control处理 WebBrowser 控件上的关键事件
【发布时间】:2010-10-13 13:29:17
【问题描述】:

我在 C# 应用程序中使用 WebBrowser 控件,并希望在 WebBrowser 具有焦点时处理所有关键事件,而不管关注哪个单个内容元素(输入字段、链接等)。我试图简单地将事件处理程序添加到浏览器控件KeyDown 事件,但这不起作用。我不想明确地将处理程序挂钩到每个可聚焦的HtmlElement

我怎样才能接收所有的关键事件之前它们被传递给浏览器或其内容元素?

【问题讨论】:

    标签: events browser webbrowser-control keydown


    【解决方案1】:

    您可以将键处理程序添加到已加载文档的 Body 元素。默认情况下,这会捕获 body 元素的任何子元素中发生的相同事件。

    webBrowser.Document.Body.KeyDown += MyKeyDownHandler;
    ...
    private void MyKeyDownHandler(object sender, HtmlElementEventArgs e)
    {
        // Set e.ReturnValue false if you want to cancel the key press
    }
    

    我认为必须在文档加载后添加处理程序,例如在 DocumentCompleted 事件处理程序中。

    【讨论】:

      【解决方案2】:

      如果你想做一些事情,比如绕过 WebBrowser 控件中的 Enter 键,那么你就不走运了,因为控件没有 KeyPress 或 KeyDown 事件。 KeyPreviewDownEventArgs 不提供任何方法来规避按键。唯一的方法是覆盖承载控件的窗体的 ProcessCmdKey 函数。例如:

      Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
      
          If keyData <> Keys.Enter Then Return MyBase.ProcessCmdKey(msg, keyData)
          Return True
      
      End Function
      

      【讨论】:

        【解决方案3】:

        你有 PreviewKeyDown 事件,只需连接它。

        private void wb_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            // your code handling the keys here, like:
            if (e.Control && e.KeyCode == Keys.C)
            {
                // Do something funny!
            }
        }
        

        【讨论】:

        • 即使 WebBrowserShortcutsEnabled 设置为 False 也能正常工作
        猜你喜欢
        • 2014-11-11
        • 1970-01-01
        • 2018-03-17
        • 1970-01-01
        • 1970-01-01
        • 2011-08-01
        • 2012-02-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多