如何知道Winforms上的用户或代码是否关闭了窗体?

问题描述:

我正在显示一个表单,30秒后表单必须自动关闭。 为了关闭窗体,我从Timers.Timer控件调用this.Close(),它将在30秒后关闭窗体。如何知道Winforms上的用户或代码是否关闭了窗体?

private void timerClose_Tick(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke((MethodInvoker)delegate() 
      { 
       this.Close(); 
      }); 
     } 
     else 
     { 
      this.Close(); 
     } 
    } 

但是,如果用户希望通过单击X按钮以关闭的形式,那么我应该能够区分形式是否被用户或计时器关闭。 我有FormClosed事件做关闭时做一些东西,但在这里我需要知道表单是否由用户或计时器关闭。

private void DISPLAY_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     //some stuff 
     timerClose.Stop(); 
    } 

我怎么知道窗体已被FormClosed Event中的User或Timer关闭?

下面的链接并不能帮助

Can we know if a window has been closed by the user or code on WPF?

在此先感谢。

+0

有一个在使用System.Timers.Timer没有意义的,从工具箱使用定时器。你需要的只是你类中的一个简单的* bool *字段,在你的Tick事件处理程序中将它设置为* true *。现在你知道了。 –

+0

我知道。但我的需求是不同的。 –

+0

不,它不是,完成你所需要的只是使用布尔 – EpicKip

你只需要做出bool(我称之为由用户关闭),当计时器关闭您的形式相应地改变它。在这种情况下,如果定时器关闭它,它不再被“用户关闭”,所以我将它设置为false。然后在结束活动中检查布尔。

实施例:

//As long as its not closed by the system, its closed by the user 
private bool closedByUser = true; 

private void timerClose_Tick(object sender, System.Timers.ElapsedEventArgs e) 
{ 
    if (this.InvokeRequired) 
    { 
     this.Invoke((MethodInvoker)delegate() 
     { 
      //closed by system 
      closedByUser = false; 
      this.Close(); 
     }); 
    } 
    else 
    { 
     this.Close(); 
    } 
} 

private void DISPLAY_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    if(closedByUser) 
     timerClose.Stop(); 
     //Closed by user 
    else 
     timerClose.Stop(); 
     //Not closed by user 
}