C# 如何在注销用户时隐藏/关闭所有表单并显示登录?

C# 如何在注销用户时隐藏/关闭所有表单并显示登录?,c#,winforms,C#,Winforms,当用户将应用程序闲置一段时间后,我无法确定如何关闭所有打开的表单并打开登录表单 下面的代码几乎可以正常工作,但非登录表单仍然可以在任务栏中看到并单击 我错过了什么?另外,我最初是否应该将var frm设置为其他值 public static void Logout() { var frm = Form.ActiveForm; for (int ix = Application.OpenForms.Count - 1; ix >= 0; --i

当用户将应用程序闲置一段时间后,我无法确定如何关闭所有打开的表单并打开登录表单

下面的代码几乎可以正常工作,但非登录表单仍然可以在任务栏中看到并单击

我错过了什么?另外,我最初是否应该将
var frm
设置为其他值

    public static void Logout()
    {
        var frm = Form.ActiveForm;
        for (int ix = Application.OpenForms.Count - 1; ix >= 0; --ix)
        {
            frm = Application.OpenForms[ix];
            if (frm.GetType() != typeof(Login))
            {
                logoutIdleUser = true;
            }
        }

        if (logoutIdleUser)
        {
            // Logout user
            MessageBox.Show("You will be logged out.", "Session Expired!");
            frm.Hide();
            new Login().Show();
        }
    }

关闭操作与搜索打开的表单无关,因此只关闭一个表单。通过更改
for
循环以包含关闭事件,您可以解决该问题。另外,我改为
foreach
,因为我们使用
frm
作为变量,以使其更具可读性。我们使用它作为循环变量并在那里声明它,而不是检查活动表单

    foreach (Form frm in Application.OpenForms)
    {            
        if (frm.GetType() != typeof(Login))
        {                               
             frm.Hide();                
        }
        new Login().Show();
        MessageBox.Show("You will be logged out.", "Session Expired!");
    }

这就是我所采用的实现方式。它在登录表单的顶部显示messagebox,而不是以前的表单。 这并不完全是我在问题中寻找的,但它是该项目可以接受的。感谢@CDove的帮助

    public static void Logout()
    {
        foreach (Form frm in Application.OpenForms)
        {
            if (frm.GetType() != typeof(Login))
            {
                frm.Hide();
                logoutIdleUser = true;
            }
        }

        if (logoutIdleUser)
        {
            new Login().Show();
            MessageBox.Show("You will be logged out.", "Session Expired!");
        }
    }

您并不是隐藏所有窗体,而是仅隐藏活动窗体。尝试将frm.Hide()移动到for(…)loopYes可以,但是我希望最后一个表单在messagebox下面仍然可见,直到在messagebox上单击OK按钮。很抱歉,我应该把这个放在问题中。然后,将这个添加到循环中:if(Form.ActiveForm!=frm)frm.Hide()ActiveForm为null。我想是因为代码在Program.csShow代码中。谢谢,但我得到编译错误“object”不包含“Hide”的定义,并且找不到接受“object”类型第一个参数的扩展方法“Hide”,这很奇怪,因为
Application.OpenForms
返回
FormCollection
,它应该只包含从
Form
继承的对象。通过上面的编辑尝试明确说明
frm
是一个
表单
。更新后的答案给出了此错误集合已修改的信息;枚举操作不能执行。我想是因为集合随着新显示的登录表单添加到集合中而发生了更改。您可以将隐藏调用移动到登录框显示之后。只需改变操作顺序。显示注销警告,并使其返回布尔值。如果为true,则隐藏所有表单,而不是使用类型条件