Vb.net 按TAB键时聚焦WebBrowser控件的问题

Vb.net 按TAB键时聚焦WebBrowser控件的问题,vb.net,winforms,focus,webbrowser-control,Vb.net,Winforms,Focus,Webbrowser Control,我正在用VB.Net、Visual Studio 2015制作一个Windows窗体应用程序。 表单有一个WebBrowser控件和其他控件。 每当按下键盘上的TAB键时,它总是首先关注WebBrowser控件中加载的html元素。然后再次按TAB键,焦点在WebBrowser控件中的HTML元素之间切换 在切换到所有HTML元素之前,焦点不会切换到表单中的其他控件 虽然我在WebBrowser控件中设置了.TabIndex=1000和.TabStop=false,但它总是首先关注WebBrow

我正在用VB.Net、Visual Studio 2015制作一个Windows窗体应用程序。
表单
有一个
WebBrowser
控件和其他控件。

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

在切换到所有HTML元素之前,焦点不会切换到
表单中的其他控件
虽然我在
WebBrowser
控件中设置了
.TabIndex=1000
.TabStop=false
,但它总是首先关注
WebBrowser
控件中加载的html元素,始终是第一个。


因此,我想通过按TAB键禁用对
WebBrowser
控件的聚焦,或者完全禁用
表单中的TAB键功能

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

首先是一个扩展的web浏览器控件,您必须在窗体上使用该控件,按下tab键时会出现一个自定义事件

这里我们调用TabStop=false以确保该键得到处理。WebBrowserShortcutsEnabled上的类似推理

然后,我们在HTML主体上捕获按键事件

如果键代码是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();
    }
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
和VB事件处理程序:

  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();
    }
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

确切地说,它总是首先关注web浏览器控件中的html元素。按轻触键时,您的问题不太清楚。如果您不希望浏览器控件成为tabstop,请将其tabstop属性设置为false。我试图理解您的问题并改进其格式。如果你们中的任何人认为我犯了错误,请随时更正我的编辑。虽然我已经在web浏览器控件中设置了“tapstop=false”,但它总是首先关注web浏览器控件中加载的html元素。谢谢。起初,您的代码级别很高,所以我对您的代码理解不够。顺便说一下,我将您的代码粘贴到我的代码中。然后发生了一个错误。在webbrowser1\u tabkeyevent处理程序中,错误消息是没有“tabkeyevent”事件。很紧张,我无法修改您的代码。私有子WebBrowser1\u TabKeyEvent(发送者作为对象,e作为EventArgs)处理WebBrowser1.TabKeyEvent是否有一种简单的方法来禁用tab键的工作(通常在控件之间切换焦点)在win form应用程序中是否完美?@bbond您必须使用我创建的继承web浏览器控件…答案是…基本控件没有tab键事件