【发布时间】:2018-03-16 06:22:39
【问题描述】:
我遇到了一个特殊的对焦问题。我创建了以下“搜索”程序:
- 它在后台运行。
- 当您双击 Ctrl 键时,它会变得可见。
- 您可以在文本框中输入内容,因为表单具有焦点。
- 如果表单失去焦点(例如,我单击桌面),它会在 3 秒后消失。
- 我再次双击 Ctrl 键,它再次变为可见。
- 但是这一次,无论我尝试什么,表单都没有获得焦点,并且如果不先手动单击表单,我就无法在文本框中输入内容。
特别有趣的是,当我在 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