Vb.net 使用Form.KeyPreview将按键传递到文本框

Vb.net 使用Form.KeyPreview将按键传递到文本框,vb.net,winforms,Vb.net,Winforms,我有一个带文本框的Winform 如果用户按下键盘上的一个键,文本应该进入文本框 为了测试文本框是否有焦点,我处理以下两个事件: Private Sub Textbox1_LostFocus(sender As Object, e As EventArgs) Handles Textbox1.LostFocus _bFocusLost = True End Sub Private Sub Textbox1_GotFocus(sender As Object, e As EventA

我有一个带文本框的Winform

如果用户按下键盘上的一个键,文本应该进入文本框

为了测试文本框是否有焦点,我处理以下两个事件:

Private Sub Textbox1_LostFocus(sender As Object, e As EventArgs) Handles Textbox1.LostFocus

    _bFocusLost = True

End Sub

Private Sub Textbox1_GotFocus(sender As Object, e As EventArgs) Handles Textbox1.GotFocus

    _bFocusLost = False

End Sub
我已将窗体的KeyPreview设置为True,以便在任何控件之前收到有关按键的通知:

Private Sub frmMain_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown

    If _bFocusLost Then
        Me.Textbox1.Focus()
    End If

End Sub
这很好,但是第一个键进入涅磐,因为文本框还没有焦点

如何将第一个键传递到文本框


谢谢大家!

首先,正如文档中明确指出的那样,应用程序开发人员不应该处理
LostFocus
GotFocus
或调用
Focus
。您应该处理的事件是
Leave
Enter
,您应该调用的方法是
Select
。您的
\u bLostFocus
字段完全没有意义,处理任何事件也没有意义。您已经可以使用
如果不是Me.TextBox1.Focused,则使用
或者
如果Me.ActiveControl不是Me.TextBox1,则使用
确定该控件是否具有焦点,而不使用任何焦点。你甚至不必测试任何东西,因为你只需调用
Me.TextBox1.Select()
,如果控件已经有焦点,它将不会有任何效果。至于这个问题,我觉得你需要确定正确的控件是否有焦点,如果没有,请记住
KeyPress
事件。在
KeyPress
事件处理程序中,如果右控件未聚焦,则可以确定输入字符是什么,然后适当设置
SelectedText
。如果有时间,我会把这个想法充实成一个答案。你只需要
Textbox1.AppendText(例如KeyChar.ToString())
,如果你只想在现有文本中添加一个字符(
ToString()
选项Strict On
会让你知道的)。不要调用
AppendText
。这假设插入符号将位于现有文本的末尾,这当然不能保证(除非是针对您的特定应用程序)。这就是为什么我说要设置
SelectedText
。这样做就像键盘输入一样,即它将在当前插入符号位置插入,并替换当前选定的任何文本。还应该考虑也可以输入控制字符,例如退格和删除。