我正在用 VB.Net Visual Studio 2015制作一个Windows Forms应用程序。Form
具有WebBrowser
控件和其他控件。
每当按键盘上的Tab键时,它始终首先关注WebBrowser
控件中加载的 html 元素。然后再次按Tab键,焦点将在WebBrowser
控件中的 HTML 元素之间切换。
直到最终在所有 HTML 元素中切换,焦点不会切换到Form
中的其他控件。
尽管我在WebBrowser
控件中设置了.TabIndex = 1000
和.TabStop = false
,但它始终首先关注WebBrowser
控件中加载的 html 元素,始终是第一个。
因此,我想通过按 TAB 键禁用对WebBrowser
控件的关注,或者完全禁用Form
中的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();
}
下面是控件的 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