我有一个应用程序(mainApp
),它打开一个模态对话框(collector
)来询问登录详细信息。该对话框的右上角有一个取消按钮和一个标准关闭按钮,并且有FormBorderStyle = FixedDialog
。
如果我设置collector.ShowInTaskBar = true
,我可以右键单击任务栏中的对话框并关闭它。对话框消失,主应用程序仍在运行。我也可以右键单击整个组并选择“关闭所有窗口”,这将关闭对话框和应用程序。
如果我设置collector.ShowInTaskBar = false
,我可以右键单击任务栏中的应用程序,然后单击“关闭”,但没有任何反应。
我不想在任务栏中显示对话框,但我希望整个应用程序在从任务栏关闭时关闭。我怎样才能做到这一点?如果这是不可能的,我会满足于关闭对话框。
编辑:ShowInTaskBar = false
答案 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
,然后再关闭。这只是一种处理它的方法,你可以尝试另一种方式。