2

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

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

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

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

编辑:主窗体的 FormClosing 事件不被调用时ShowInTaskBar = false

4

3 回答 3

1

当您单击任务栏中的关闭时,是否会触发 MainForm 的关闭事件?如果是这样,并且应用程序由于对话框窗口的存在而被迫保持打开状态,您可以尝试在 Closing 事件中以编程方式关闭对话框,然后让事件运行。

注意:这都是猜测,我已经很久没有做过任何 WinForms 工作了,所以我可能把事件名称弄错了。

于 2013-11-05T12:00:04.353 回答
0

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

loginWindow.Close();

关闭对话框窗口。此操作也可以在 loginwindow 内发生,例如用户单击按钮关闭和窗口关闭。

于 2013-11-05T11:59:37.793 回答
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在显示对话框之前打开标志,然后关闭。这只是一种处理方式,您可以尝试其他方式。

于 2013-11-05T17:27:05.040 回答