按TAB键时关注WebBrowser控件的问题

问题描述 投票:2回答:1

我正在使用VB.Net,Visual Studio 2015制作Windows窗体应用程序。 Form有一个WebBrowser控制和其他控制。

每当按下键盘上的TAB键时,它总是专注于WebBrowser控件中加载的html元素。然后再次按TAB键,焦点在WebBrowser控件中的HTML元素之间切换。

直到最后切换所有HTML元素,焦点不会切换到Form中的其他控件。 虽然我在.TabIndex = 1000控件中设置了.TabStop = falseWebBrowser,但它总是首先关注在WebBrowser控件中加载的html元素。

所以,我想通过按TAB键禁用聚焦WebBrowser控件或完全禁用Form中的TAB键功能。

vb.net winforms focus webbrowser-control
1个回答
0
投票

我必须尽快在VB.NET中完成答案,但是现在这里是它的C#版本:

首先,扩展的Web浏览器控件,您必须在表单上使用,在按下Tab键时使用自定义事件。

这里我们调用TabStop = false来确保处理此密钥。 WebBrowserShortcutsEnabled上的类似推理。

然后,我们捕获HTML Body,即按键事件。

如果密钥代码是9(标签),我们会触发我们的活动。

public class WebBrowserExtended : System.Windows.Forms.WebBrowser
{

    protected virtual void OnTabKeyEvent(EventArgs e)
    {
        EventHandler handler = TabKeyEvent;
        if (handler != null)
        {
            handler(this, e);
        }
    }

    public event EventHandler TabKeyEvent;

    public WebBrowserExtended() : base()
    {
        this.TabStop = false;
        this.WebBrowserShortcutsEnabled = false;
    }

    protected override void OnDocumentCompleted(WebBrowserDocumentCompletedEventArgs e)
    {
        base.OnDocumentCompleted(e);
        if (this.Document.Body != null)
            this.Document.Body.KeyDown += new HtmlElementEventHandler(Body_KeyDown);
    }

    private void Body_KeyDown(Object sender, HtmlElementEventArgs e)
    {
        if (e.KeyPressedCode == 9 && !e.CtrlKeyPressed)
        {
            this.OnTabKeyEvent(e);
            e.BubbleEvent = false;
        }
    }
}

这是你的事件处理程序:

  private void webBrowser1_TabKeyEvent(object sender, EventArgs e)
    {
        var controls = new List<Control>(this.Controls.Cast<Control>());
        var nextControl = controls.Where(c => c.TabIndex > webBrowser1.TabIndex).OrderBy(c => c.TabIndex).FirstOrDefault();
        if (nextControl != null)
            nextControl.Focus();
        else
            controls.OrderBy(c => c.TabIndex).FirstOrDefault().Focus();
    }

这是控件的VB版本:

Public Class WebBrowserExtended
    Inherits System.Windows.Forms.WebBrowser

    Protected Overridable Sub OnTabKeyEvent(ByVal e As EventArgs)
        RaiseEvent TabKeyEvent(Me, e)
    End Sub

    Public Event TabKeyEvent As EventHandler

    Public Sub New()
        MyBase.New()
        Me.TabStop = False
        Me.WebBrowserShortcutsEnabled = False
    End Sub

    Protected Overrides Sub OnDocumentCompleted(ByVal e As WebBrowserDocumentCompletedEventArgs)
        MyBase.OnDocumentCompleted(e)
        If Me.Document.Body IsNot Nothing Then
            AddHandler Me.Document.Body.KeyDown, AddressOf Body_KeyDown
        End If
    End Sub

    Private Sub Body_KeyDown(ByVal sender As Object, ByVal e As HtmlElementEventArgs)
        If e.KeyPressedCode = 9 AndAlso Not e.CtrlKeyPressed Then
            Me.OnTabKeyEvent(e)
            e.BubbleEvent = False
        End If
    End Sub
End Class

和VB事件处理程序:

Private Sub WebBrowser1_TabKeyEvent(sender As Object, e As EventArgs) Handles WebBrowser1.TabKeyEvent

        Dim controls = New List(Of Control)(Me.Controls.Cast(Of Control))
        Dim nextControl = controls.Where(Function(c)
                                             Return c.TabIndex > WebBrowser1.TabIndex
                                         End Function).OrderBy(Function(c)
                                                                   Return c.TabIndex
                                                               End Function).FirstOrDefault()
        If Not controls Is Nothing Then
            nextControl.Focus()
        Else
            controls.OrderBy(Function(c)
                                 Return c.TabIndex
                             End Function).FirstOrDefault().Focus()
        End If


    End Sub
© www.soinside.com 2019 - 2024. All rights reserved.