我有一个计时器,每次都显示一个消息框,上面写着“你好”。我也配置了代码,所以每当窗口失去焦点时,它应该停止保持盒子到来的计时器。然而,他们继续前进。
我在类似的程序中尝试过类似的东西,代码太长,无法在这里发布,但是它做的是它第一次暂停,停止计时器,当计时器是再次停止,它无法正常工作。还有一些其他代码有一个随机元素,当生成一定数量时会显示不同的提示,但是一旦生成,它每次都会使用相同的不同提示。
这是一个错误,没有足够的时间处理所有代码并且它“重叠”一些?我可以延迟计时器而没有那么多不同的效果,但我认为我的[下端]正在运行该程序的CPU,1.6 GHz的CPU可以处理带有几个消息框的计时器。虽然,VS同时运行,但我不必每次都需要测试它时导出我的代码并关闭VS。
如果问题时间不够,有没有办法阻止我的程序“多线程”或者它正在做什么?这似乎是一个奇怪的问题,但计算机也很奇怪。 :P
修改
通过“焦点”我指的是最明显的选定窗口。例如,我的浏览器现在“专注”。我被告知正确的术语是“选中的”。我一定是在使用错误类型的事件触发器......:P
答案 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)
使用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.Focus
为False
。如果单击“接受”按钮,消息将开始弹出;您甚至不需要选择表单(焦点会自动从MessageBox
传输到Form
)。
摘要:MessageBox
确实会使Form
失去焦点,尽管在点击接受按钮后会自动返回,这是一种“棘手”的丢失。 / p>
更新:建议的配置会触发以下形式的LostFocus
事件:
Private Sub Form1_LostFocus(sender As Object, e As System.EventArgs) Handles Me.LostFocus
MsgBox("lost")
End Sub
不像其他答案/评论,我从你的问题中理解的是你想知道原因以及这是否是正常行为,而不是找到一个有效的解决方案让表格失去焦点(你不是甚至描述了你希望这种情况发生的确切条件。)