【问题标题】:Set Focus to Form After Me.Show将焦点设置为 After Me.Show
【发布时间】:2018-03-16 06:22:39
【问题描述】:

我遇到了一个特殊的对焦问题。我创建了以下“搜索”程序:

  1. 它在后台运行。
  2. 当您双击 Ctrl 键时,它会变得可见。
  3. 您可以在文本框中输入内容,因为表单具有焦点。
  4. 如果表单失去焦点(例如,我单击桌面),它会在 3 秒后消失。
  5. 我再次双击 Ctrl 键,它再次变为可见。
  6. 但是这一次,无论我尝试什么,表单都没有获得焦点,并且如果不先手动单击表单,我就无法在文本框中输入内容。

特别有趣的是,当我在 Visual Studios 中以调试模式运行该程序时,该程序重新聚焦于双击 Ctrl 键并变得可见,我可以立即开始输入文本盒子。但是,当我构建这个程序并单独运行它时,程序会出现,但不会重新获得焦点双击 Ctrl 键,因此我无法在文本框中键入,直到我手动单击表单。

在 Me.Show() 之后我尝试过:

  • Me.Focus()
  • Me.Validate()
  • Me.Select()
  • Textbox1.Select()
  • Textbox1.Focus()

表单在最上面,通常以管理员身份运行,但无论如何都会出现同样的问题。

可以以更简单的方式重新创建问题。用

创建一个表单
  • 按钮(“Button1”)
  • 文本框
  • 两个计时器(“hideForm”、“showForm”)的间隔均为 1000

代码:

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    hideForm.Start()
    sender.Enabled = False
End Sub

Private Sub hideForm_Tick(sender As Object, e As EventArgs) Handles hideForm.Tick
    Me.Hide()
    hideForm.Stop()
    showForm.Start()
End Sub

Private Sub showForm_Tick(sender As Object, e As EventArgs) Handles showForm.Tick
    showForm.Stop()
    Me.Show()
    Me.Activate()
End Sub
End Class

单击按钮,然后立即单击另一个窗口(因此表单失去焦点)。等到表单被隐藏并再次显示。文本框应该有焦点。尝试输入。

如果程序在 Visual Studios 中以调试模式运行,它会按预期工作。如果你构建程序并在 VS 之外运行它,表单会重新出现而没有焦点,并且如果不手动选择表单就无法在文本框中输入。

对不起,冗长的解释。这是一个很难正确描述的问题。

【问题讨论】:

  • 你试图违反一个非常基本的 Windows 可用性规则,当用户与另一个用户交互时,你不能将一个窗口推到用户的脸上。按下 CTRL 键可以让操作系统相信它是需要保持焦点的当前窗口。您将不得不以不同的方式执行此操作,谷歌“winforms 热键”用于基本点击。 NotifyIcon 是另一种标准解决方案。
  • @HansPassant 嘿,感谢您的反馈。同样值得注意的是,如果程序在我调用Me.Hide 时有焦点,它会强行将焦点偷回Me.Show,但如果应用程序没有使用Me.Hide 的焦点,这将不起作用。我将查看其他一些选项,但这个程序的想法是能够在不使用鼠标的情况下执行任务。我会看看我能找到什么。当您按下 Windows 键时,开始菜单会窃取焦点。这正是我想要的。

标签: vb.net visual-studio-2015 focus


【解决方案1】:

尝试表单事件处理程序Activate。在该方法中,您可以使用setFocus 来获得该特定文本框的焦点。我知道这个答案为时已晚。但希望这对某人有所帮助。

Private Sub Form_Activate()
    TextBox1.SetFocus
End Sub

【讨论】:

    【解决方案2】:

    尝试Form_Activate 的事件处理程序,并在该处理程序中将焦点传递给您的文本框。

    除了Focus,你也可以试试TextBox1.SelectThis SO link 提供了一些额外的信息以及FocusSelect 之间的区别。

    【讨论】:

    • 我现在已经尝试过了。在“Form1_Activated”下,我使用了 Textbox1.Focus(),但没有运气。文本框似乎被选中(蓝色边框),但表单本身没有被选中,因此不接受按键。
    • 有趣的是,该事件确实触发了,但表单肯定没有聚焦,因为按键仍然会传递给我在表单显示之前关注的任何内容,无论是这个互联网浏览器还是我的桌面等。并且表单的标题栏不是正确的颜色来指示具有焦点的表单。
    • @Timothy:添加了另一个选项和有用的链接。
    • Form.Activate 在表单接收焦点时发生。请改用Form.Show
    • @VisualVincent 您好,感谢您的回复。我现在已经尝试使用 FocusSelect 并且我已经在 Form.ShowForm.Activated 下尝试过它们
    【解决方案3】:

    在设计视图窗口中选择要为其分配焦点的文本框。 在“属性”窗口下,将 TabIndex 设置为 0(零)。

    我什至不必使用TextBox1.Focus() 命令。 TabIndex 覆盖 Focus 命令仍然困扰着我。

    【讨论】:

      【解决方案4】:

      我尝试(并为我工作)是在事件处理程序Shown() [VB] 中设置文本框的Focus()

      Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
          Me.Textbox1.Focus()
      End Sub
      

      注意:Select() 方法并没有完成这项工作。我希望这对遇到同样问题的其他人有所帮助。

      【讨论】:

        猜你喜欢
        • 2017-05-26
        • 1970-01-01
        • 2011-10-08
        • 2010-09-27
        • 1970-01-01
        • 2016-01-19
        • 1970-01-01
        • 2013-10-04
        • 1970-01-01
        相关资源
        最近更新 更多