当对话框的ShowInTaskBar = false时,如何通过任务栏关闭应用程序或模式对话框?

时间:2013-11-05 11:53:00

标签: c# .net winforms

我有一个应用程序(mainApp),它打开一个模态对话框(collector)来询问登录详细信息。该对话框的右上角有一个取消按钮和一个标准关闭按钮,并且有FormBorderStyle = FixedDialog

如果我设置collector.ShowInTaskBar = true,我可以右键单击任务栏中的对话框并关闭它。对话框消失,主应用程序仍在运行。我也可以右键单击整个组并选择“关闭所有窗口”,这将关闭对话框和应用程序。

如果我设置collector.ShowInTaskBar = false,我可以右键单击任务栏中的应用程序,然后单击“关闭”,但没有任何反应。

我不想在任务栏中显示对话框,但我希望整个应用程序在从任务栏关闭时关闭。我怎样才能做到这一点?如果这是不可能的,我会满足于关闭对话框。

编辑:ShowInTaskBar = false

时,不会调用主窗体的FormClosing事件

3 个答案:

答案 0 :(得分:1)

当您在任务栏中单击“关闭”时,是否会触发MainForm的Closing事件?如果确实如此,并且应用程序被对话窗口强制保持打开状态,您可以尝试以编程方式关闭Closing事件中的对话框,然后让事件继续运行。

注意:这是所有推测,自从我做任何WinForms工作以来已经很长时间了,所以我可能会错误地记录事件名称。

答案 1 :(得分:0)

您必须在mainApp中存储对登录窗口的引用。然后你可以这样写:

loginWindow.Close();

关闭对话窗口。此操作也可以在loginwindow中进行,例如用户单击按钮关闭并关闭窗口。

答案 2 :(得分:0)

当您以这种方式关闭表单时,邮件WM_SYSCOMMAND将被发送到您的表单窗口。我们可以通过一些信息性的参数来捕获此消息,以执行相应的操作。试试这段代码:

public partial class Form1 : Form {
   public Form1(){
     InitializeComponent();
   }
   bool shownModal;//This flag will be used to determine if there is some
                  //modal dialog opening.
   protected override void WndProc(ref Message m) {
        if (m.Msg == 0x112)//WM_SYSCOMMAND
        {
            //SC_CLOSE = 0xf060  
            if (m.WParam.ToInt32() == 0xf060 && 
                m.LParam.ToInt32() == 0 && shownModal)
            {
                //Your own code here
                //You can close the main form or close the modal dialog
                Close();
            }
        }
        base.WndProc(ref m);            
    }
}

注意:您必须在显示对话框之前打开标记shownModal,然后再关闭。这只是一种处理它的方法,你可以尝试另一种方式。