在Form1打开时防止Form2打开而不使用'MainWindowTitle'

时间:2010-07-08 11:35:40

标签: c# winforms

我有一个winforms应用程序,其中包含一个管理表单(称为'adminForm')和另一个表单(称为'userForm'),该表单位于打开并在设定的时间间隔内运行的计时器上。

如何在adminForm打开时阻止userForm打开?

直到最近,在这样的代码中使用'MainWindowTitle'值阻止了userFrom的打开:

           // Retrieving all running processes for checking admin interface running or not
            Process[] objArrPrs = Process.GetProcesses();

            foreach (Process objProces in objArrPrs)
            {
                string strMainWindowTitle = string.Empty;
                strMainWindowTitle = objProces.MainWindowTitle.ToString();

                if (strMainWindowTitle != string.Empty || strMainWindowTitle != "") 
                {
                    // Retrievig process name
                    string strProcess = objProces.ProcessName;
                    if ((strMainWindowTitle == "XXXXX" && strProcess == "XXXXX")
                        || ((strMainWindowTitle == "XXXXX" && strProcess == "XXXXX.vshost")))
                    {
                        blnAdminScrOpen = true;
                        break;
                    }
                }
            }

其中“XXXXX”是adminForm.Text值(例如,'this.Text =“XXXXX”)。这种方法运行正常。

但是,这两个表单现在都已经过重新设计,并且没有表单标题栏,所以现在表单'Text值为null,上面显示的代码不再有效。

有没有人对新的c#策略有什么建议我可以用来阻止adminForm打开时userFrom打开?如果您能指出一些示例代码,我们将不胜感激。

干杯, 弗雷德里克enter code here

3 个答案:

答案 0 :(得分:1)

如果表单来自同一个应用程序,请循环遍历所有打开的表单OpenForms并检查它们是否已打开。

检查所有进程不是一种非常好的检查方法,如果进程名称发生更改,可能很容易中断,例如

答案 1 :(得分:0)

您可以在表单上实现Singleton模式,然后获取adminForm的成员变量并检查其Visible属性。如果您不熟悉Singleton模式,我可以提供代码。它基本上改变了你的类,因此只能有一个实例。它需要对现有代码进行一些修改,但最终会成为一个更清晰的解决方案。

单身人士模式的要点如下:

public class MyForm : Form
{
    //this is used to keep a reference of the single
    //instance of this class
    private static MyForm _instance; 

    //your constructor is private, this is important.
    //the only thing that can access the constructor is 
    //the class itself.
    private MyForm()
    {
        //do stuff
    }

    public static MyForm GetInstance()
    {
        //the check to IsDisposed is important
        //if the form is closed, the _instance variable
        //won't be null, but if you return the closed 
        //form (ie, disposed form) any calls to the form
        //class (ie, Show()) will throw in exception.
        if (_instance == null || _instance.IsDisposed)
        {
            _instance = new MyForm();
        }
        return _instance;
    }

    //other code
}

您曾经这样做过:

MyForm f = new MyForm();

您现在可以这样做:

MyForm f = new MyForm.GetInstance();

答案 2 :(得分:0)

作为Tim所说的替代方法,您还可以实现一个静态类,其中包含对AdminForm主要实例的引用。例如:

public static class Global {
    public static AdminForm AdminFormInstance { get; set; }
}

在AdminForm的构造函数中,您可以添加以下行:

public AdminForm() {
    // -snip-
    Global.AdminFormInstance = this;
}

然后,如果你需要检查它是否可见,只需检查Visible属性:

if (Global.AdminFormInstance.Visible == false)
    DoSomethingWhenItsNotVisible();

请记住,您的静态成员不是线程安全的,尽管您似乎没有进行任何多线程处理。