2009-11-27 77 views
1

我希望我的应用程序能够在单击关闭(X)按钮时使系统托盘最小化。C#应用程序关闭问题

只有通过在主应用程序窗口上单击不同的按钮/菜单或单击系统托盘上下文菜单项才能关闭它。

我可以使窗口最小化到关闭的托盘。

但是我面对的问题是,我现在无法关闭应用程序。

这是我的代码(这是无法关闭应用程序):

public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void hideToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      this.Visible = false; 
     } 

     private void showToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      this.Visible = true; 
     } 

     private void quitToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Application.DoEvents(); 
      Application.Exit(); 
     } 

     private void Form1_Resize(object sender, EventArgs e) 
     { 
      if (FormWindowState.Minimized == this.WindowState) 
      { 
       notifyIcon1.Visible = true; 
       notifyIcon1.ShowBalloonTip(500); 
       this.Hide(); 
      } 
      else if (FormWindowState.Normal == this.WindowState) 
      { 
       notifyIcon1.Visible = false; 
      } 
     } 

     private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      e.Cancel = true; 
      this.WindowState = FormWindowState.Minimized; 
     } 

     private void notifyIcon1_DoubleClick(object sender, EventArgs e) 
     { 
      this.Show(); 
      this.WindowState = FormWindowState.Normal; 
     }   
    } 

回答

8

在按钮,设置一个字段,例如:

bool isClosing; 
private void quitToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    isClosing = true; 
    Close(); 
} 

,并在“关闭检查此“:

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(!isClosing) { 
     e.Cancel = true; 
     this.WindowState = FormWindowState.Minimized; 
    } 
} 
2

这是因为它总是触发表单关闭事件处理程序,您可以在其中取消事件。

地方有一个条件,跳过取消该事件如果窗体已经被最小化

2

我可能会建议一个稍微不同的方式,你有主要的问题是,您的应用程序正在运行的形式,所以你必须很多解决方法可以确保表单不会关闭。

我在使用真正存在于系统托盘中的应用程序时所做的工作是创建自定义应用程序上下文,这实际上简化了过程。我写的那个Here is an article告诉你如何去做。

2

在您重写紧密行为的地方添加一个标志,并通过检查close事件参数上的CloseReason枚举值来覆盖其他出口情况。

bool m_NeedClose = false; 

private void quitToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    m_NeedClose = true; 
    Close(); 
} 

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if(m_NeedClose || 
     (e.CloseReason != CloseReason.UserClosing)) 
    { 
     return; 
    } 

    e.Cancel = true; 
    this.WindowState = FormWindowState.Minimized; 
} 

FormClosingEventArgs @ MSDN
CloseReason Enumeration @ MSDN