1

我有一个计时器,每次都会显示一个消息框,上面写着“你好”。我还配置了代码,因此每当窗口失去焦点时,它应该停止保持框出现的计时器。然而,他们不断地来。

我在类似的程序中尝试过类似的事情,但代码太长,无法在此处发布,但所做的是它第一次暂停,停止计时器,当计时器再次停止时,它无法正常工作。那里还有一些其他代码具有随机元素,当生成某个数字时会显示不同的提示,但是一旦生成,它每次都会使用相同的不同提示。

这是没有足够时间处理所有代码的错误并且它“重叠”了一些代码吗?我可以在没有太多不同效果的情况下延迟计时器,但我认为运行此程序的 [低端] CPU 具有 1.6 GHz,它可以处理带有几个消息框的计时器。虽然 VS 正在同时运行,但我不应该每次需要测试它时都导出我的代码并关闭 VS。

如果问题没有足够的时间,有没有办法可以阻止我的程序“多线程”或它正在做的任何事情?这似乎是一个奇怪的问题,但计算机也很奇怪。:P

编辑:

“焦点”是指最明显的选定窗口。例如,我的浏览器现在“聚焦”了。我被告知正确的术语是“选择的”。我一定是使用了错误类型的事件触发器......:P

4

2 回答 2

4

它不会生成失去焦点事件,因为表单一开始就没有焦点。窗体上的控件始终获得焦点,如 Button 或 TextBox。您可以改用 Deactivate 事件。

或者当 Tick 事件再次触发时不显示消息框。大致:

Private ShowingMsgBox As Boolean

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    '' Do stuff
    ''
    If Not ShowingMsgBox Then
        ShowingMsgBox = True
        MsgBox("yada")
        ShowingMsgBox = False
    End If
End Sub

这种行为的根本原因是 MsgBox 泵送了一个消息循环。它保持正常的 Windows 消息被传递,例如保持窗口绘制的 WM_PAINT。还有 WM_TIMER,即生成 Tick 事件的那个。它阻止的唯一类型的消息是输入事件、鼠标和键盘消息。否则 Application.DoEvents() 非常危险的原因。它的作用与 MsgBox() 相同,但不禁用输入。

于 2013-09-25T22:21:39.443 回答
2

Timer使用( )创建一个新项目Timer1并编写以下代码:

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick

    If (Me.Focused) Then
        MessageBox.Show("Hello")
    End If

End Sub

如果将鼠标放在表单上,​​您会看到在给定Interval结束后会弹出一个消息框。如果您不单击接受按钮并将鼠标停留在表单上,​​您将看到不会出现更多消息:Me.Focusis False。如果您单击接受按钮,则消息将开始弹出;您甚至不需要选择表单(焦点会自动从 转移MessageBoxForm)。

总结:MessageBox确实会让人Form失去焦点,虽然是一种“刁钻”,但只要点击接受按钮就会自动回来。

更新:建议的配置确实触发了LostFocus以下形式的事件:

Private Sub Form1_LostFocus(sender As Object, e As System.EventArgs) Handles Me.LostFocus
    MsgBox("lost")
End Sub

不像其他答案/评论,我从您的问题中了解到的是,您想知道原因以及这是否是正常行为,而不是获得一个可行的解决方案来使表单失去焦点(您甚至没有描述您希望发生这种情况的确切条件)。

于 2013-09-25T22:07:56.947 回答