我的应用程序中有一个计时器(timer1)。当这个计时器熄灭时,它会调用一个刷新我的datagridview的子程序。在调用refresh子程序之前,我使用user32 Lib中的GetActiveWindow()来检查表单是否为活动窗口。这按预期工作。这是我用来检查活动窗口的代码。
If Me.Handle = GetActiveWindow() Then
gridRefresh()
Else
MessageBox.Show("Works")
End If
我包含了消息框只是为了给我一个视觉效果当活动窗口不是我的应用程序时它确实有用。
我缺少的是,一旦我的应用程序再次变为活动窗口,我想调用gridRefresh()子。
我的第一个想法是使用Do Until循环并让它什么都不做,直到它再次成为活动窗口:
If Me.Handle = GetActiveWindow() Then
gridRefresh()
Else
Do Until Me.Handle = GetActiveWindow()
Loop
gridRefresh()
End If
但是当我尝试这个解决方案时,它永远不会出现循环。
编辑:定时器间隔为1分钟。我希望它再次变为活动状态时刷新的原因是用户不必等待一分钟才能看到是否有任何内容添加到gridview
答案 0 :(得分:2)
你没有正确地做到这一点,Winforms已经支持所有这些。不需要pinvoke,您可以使用Form.ActiveForm属性。 Activate和Deactivate事件告诉您表单已取消/激活。将此代码放在包含网格的表单中:
protected override void OnDeactivate(EventArgs e) {
// Runs when the window is deactivated. Stop the timer
timer1.Enabled = false;
base.OnDeactivate(e);
}
protected override void OnActivated(EventArgs e) {
// Runs when the window is activated. Start the timer and immediately refresh
timer1.Enabled = true;
timer1_Tick(this, EventArgs.Empty);
base.OnActivated(e);
}
private void timer1_Tick(object sender, EventArgs e) {
// Periodically refresh the grid
gridRefresh();
}
答案 1 :(得分:1)
您可以在表单类中添加两个Boolean
字段,名为Active
和RefreshRequired
。
然后在表单的Activated
和Deactivate
事件中添加处理程序。 Deactivate
事件处理程序只将Active
设置为false。 Activated
事件处理程序如下所示:
Active = True
If RefreshRequired Then
gridRefresh()
RefreshRequired = False
End If
最后,您将原始代码重写为:
If Active Then
gridRefresh()
Else
RefreshRequired = True
End If