毕业设计,写一个Winform+Windows Service的程序。Winform用来配置参数,Windows Service用来执行具体任务,主要用来做局域网内的文件自动迁移。
考虑到程序的特殊性和用户的习惯,在窗体中点击关闭时,程序应该最小化到托盘,而右击托盘上的程序ICON,单击“退出系统”时,才关闭应用程序。
但窗体上的关闭,是封装好了的。除非将其屏蔽后,自己重写关闭事件。这样,太麻烦了,有没简单一点的实现方法呢?在窗体的Closing事件中,我试着添加如下代码:
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Visible = false;
}
单击关闭时,程序确实不会退出,而保留在系统托盘上。但问题又来了,选择托盘上的“退出系统”也无法关闭程序。看来Application.Exit()方法,实际上也调用了frmMain.Close()方法,从而在窗体关闭前被中止了。
继续百度,google……
无语,竟没找到一种很好的解决办法!
仔细分析一下,窗体上的关闭和托盘上的关闭,其实是两个不同的事件。为了达到目的,必须点击窗体上的关闭时,执行closing事件,而点托盘上的“退出系统”时不执行此事件。设个标志变量试试,在窗体里,加一 private bool allowExit = false;执行Application.Exit()前,把allowExit=true;最后在closing事件中判断allowExit,代码如下:
private void cmsNotify_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
if (e.ClickedItem.Name == "smItemOpen")
{
this.Visible = true;
}
else if (e.ClickedItem.Name == "smItemExit")
{
DialogResult dr = MessageBox.Show("确认退出本系统?","退出询问",MessageBoxButtons.YesNo,MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
allowExit = true;
Application.Exit();
}
}
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (!allowExit)
{
e.Cancel = true;
this.Visible=false;
}
}
到此,问题得到解决。虽然麻烦了点,但比起屏蔽掉关闭,然后自己添加关闭按钮,再写最小化事件好些吧,^O^