为什么MsgBox没有触发丢失焦点事件VB.net?

时间:2013-09-25 21:51:19

标签: vb.net vb.net-2010 msgbox

我有一个计时器,每次都显示一个消息框,上面写着“你好”。我也配置了代码,所以每当窗口失去焦点时,它应该停止保持盒子到来的计时器。然而,他们继续前进。

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

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

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

修改

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

2 个答案:

答案 0 :(得分: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()的作用相同,不会禁用输入。

答案 1 :(得分:2)

使用TimerTimer1)创建一个新项目并编写此代码:

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.FocusFalse。如果单击“接受”按钮,消息将开始弹出;您甚至不需要选择表单(焦点会自动从MessageBox传输到Form)。

摘要:MessageBox确实会使Form失去焦点,尽管在点击接受按钮后会自动返回,这是一种“棘手”的丢失。 / p>

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

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

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