在.NET Windows Forms中,如何确定当前具有焦点的控件?

24
7个回答

31

1
只是想指出,如果您更改了某些内容(例如设置.Text属性),它将返回您最后使用的控件,包括设置像.Text这样的内容,而不总是具有焦点的控件。 - PsychoData

14

请注意,当使用层次结构时,仅调用一次ActiveControl是不够的。想象一下:

Form
    TableLayoutPanel
        FlowLayoutPanel
            TextBox (focused)

(formInstance).ActiveControl 会返回一个对 TableLayoutPanel 的引用,而不是对 TextBox 的引用。

因此请使用以下代码(完整披露:改编自 此 C# 答案

  Function FindFocussedControl(ByVal ctr As Control) As Control
    Dim container As ContainerControl = TryCast(ctr, ContainerControl)
    Do While (container IsNot Nothing)
      ctr = container.ActiveControl
      container = TryCast(ctr, ContainerControl)
    Loop
    Return ctr
  End Function

私有子frmPartes_KeyDown(发送者作为对象,e作为KeyEventArgs)处理Me.KeyDown如果e.KeyCode = Keys.Enter ThenDim Ct As Windows.Forms.ControlCt = FindFocussedControl(Me.ActiveControl)如果Ct的类型是TextBox或System.Windows.Forms.UserControl,则过滤()e.Handled = Truee.SuppressKeyPress = TrueEnd IfEnd Sub也许需要使用Windows.Forms.Control而不仅仅是控件。 - R.Alonso
1
这应该是正确的答案。仅使用ActiveControl并不能始终满足您的需求(这也是我来到这里寻找答案的原因!)。 - Dan

3

在C#中,我这样做:

        if (txtModelPN != this.ActiveControl)
            txtModelPN.BackColor = Color.White;

txtModelPN是一个文本框,在进入和鼠标移入时我会将其突出显示,并在离开和鼠标移出时取消突出显示。但如果它是当前控件,我就不会将背景设置回白色。

VB的等效代码如下:

IF txtModelPN <> Me.ActiveControl Then
   txtModelPN.BackColor = Color.White
End If

3
你可以使用表单的 ActiveControl 属性,并使用该控件。
me.ActiveControl

或者

Form.ActiveControl

1
您可以使用此功能通过控件名称查找。
    If DataGridView1.Name = Me.ActiveControl.Name Then
        TextBox1.Visible = True
    Else
        TextBox1.Visible = False
    End If

0

我使用了以下内容:

Private bFocus = False
Private Sub txtUrl_MouseEnter(sender As Object, e As EventArgs) Handles txtUrl.MouseEnter
    If Me.ActiveControl.Name <> txtUrl.Name Then
        bFocus = True
    End If
End Sub

Private Sub txtUrl_MouseUp(sender As Object, e As MouseEventArgs) Handles txtUrl.MouseUp
    If bFocus Then
        bFocus = False
        txtUrl.SelectAll()
    End If
End Sub

我只在鼠标进入时设置变量,以提高程序的效率。


-1

大致上是这样的:

Protected Function GetFocusControl() As Control
    Dim focusControl As Control = Nothing

    ' Use this to get the Focused Control: 
    Dim focusHandle As IntPtr = GetFocus()
    If IntPtr.Zero.Equals(focusHandle) Then          
      focusControl = Control.FromHandle(focusHandle)
    End If

    ' Note that it returns NOTHING if there is not a .NET control with focus 
    Return focusControl
End Function

我想这段代码来自windowsclient.net,但已经有一段时间了...


2
请允许我在你完成回答之前给它点个踩。调用 GetFocus() 函数会导致程序停滞不前,这种形式的答案根本行不通。 - miroxlav
点赞 - 虽然这需要 P/Invoke,并且答案并没有完全解释如何调用函数,但是更多搜索“.NET GetFocus”可以解决这个问题。虽然可能不是作者的意图,但问题并不限于当前应用程序,而这是唯一一个尝试查找实际活动控件的答案,无论它在哪里/是什么。 - izzy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接