使用GetActiveWindow()

时间:2014-01-10 09:23:43

标签: vb.net winforms loops infinite-loop user32

我的应用程序中有一个计时器(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

2 个答案:

答案 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字段,名为ActiveRefreshRequired

然后在表单的ActivatedDeactivate事件中添加处理程序。 Deactivate事件处理程序只将Active设置为false。 Activated事件处理程序如下所示:

Active = True
If RefreshRequired Then
   gridRefresh()
   RefreshRequired = False
End If

最后,您将原始代码重写为:

If Active Then
    gridRefresh()
Else
    RefreshRequired = True
End If