C#靠近托盘(如msn messenger)

C#靠近托盘(如msn messenger),c#,minimize,tray,C#,Minimize,Tray,我有一个c#net应用程序。因此,我创建了一个位于托盘中的notifyIcon。我想做的是,当用户点击表单上的“x”按钮时,我希望它靠近托盘。他们应该只能通过使用托盘图标中的上下文菜单退出程序 所以我所做的是,在表单关闭事件中,我检查表单是否可见。如果它是可见的,我将其设置为不可见,并将showInTaskbar设置为false(模拟最小化到托盘)。如果窗体已经不可见,那么他们可能正在从托盘关闭它,因此在这种情况下,我将退出程序 然而,我的问题是,如果窗口是可见的,但他们右键单击托盘图标的上下文

我有一个c#net应用程序。因此,我创建了一个位于托盘中的notifyIcon。我想做的是,当用户点击表单上的“x”按钮时,我希望它靠近托盘。他们应该只能通过使用托盘图标中的上下文菜单退出程序

所以我所做的是,在表单关闭事件中,我检查表单是否可见。如果它是可见的,我将其设置为不可见,并将showInTaskbar设置为false(模拟最小化到托盘)。如果窗体已经不可见,那么他们可能正在从托盘关闭它,因此在这种情况下,我将退出程序

然而,我的问题是,如果窗口是可见的,但他们右键单击托盘图标的上下文菜单并点击退出,我需要退出程序,而不是最小化


如何解决此问题?

您可能希望根据用户的操作跟踪应用程序的状态,因为这不一定反映在窗口的状态中。因此,当用户从菜单中选择“退出”时,您需要设置一个标志来指示您确实正在退出,而不仅仅是隐藏窗口。

尝试以下操作:

bool _closingFromMenu;

void NOTIFYICON_EXIT_MENU_HANDLER(object sender, EventArgs e)
{
    _closingFromMenu = true;
    Close();
}

//form closing handler
FormClosing +=(a,b) =>{
    if(_closingFromMenu){
        Close();
    }
    else{
        e.Cancel = true;
        //do minimize stuff;
    }
}

或者,如果您只有一个表单,则可以调用
Application.Exit()在上下文菜单项处理程序中

只需使上下文菜单关闭事件调用应用程序。退出()

应用程序。退出()将不起作用,因为这仍然会触发表单关闭事件。我认为,正如一些人提到的,我需要使用一个标志来表示请求来自何处(托盘菜单vs x按钮)