如何运行ac#WinForm应用程序的一个实例?

aby*_*aby 4 c# mutex single-instance

我有一个C#应用程序,它在启动时显示登录表单,并在用户通过身份验证后显示主表单.我使用Mutex限制只运行我的应用程序的一个实例.而且,这只适用于登录表单.显示主窗体后,它不会限制用户重新打开登录表单.我正在寻找一种解决方案,一旦主窗体已经打开,登录屏幕就无法显示.

这是我的Program.cs

 [STAThread]
    static void Main()
    {
        bool mutexCreated=true;

        using (Mutex mutex = new Mutex(true, "eCS", out mutexCreated))
        {
            if (mutexCreated)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Login());
            }
            else
            {
                Process current = Process.GetCurrentProcess();
                foreach (Process process in Process.GetProcessesByName(current.ProcessName))
                {
                    if (process.Id != current.Id)
                    {
                        XtraMessageBox.Show("Another instance of eCS is already running.", "eCS already running", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        SetForegroundWindow(process.MainWindowHandle);
                        break;
                    }
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mac*_*ska 7

我做了一些小改动:


namespace CSMutex
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            bool mutexCreated=true;
            using(Mutex mutex = new Mutex(true, "eCS", out mutexCreated))
            {
                if (mutexCreated)
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    Login loging = new Login();
                    Application.Run(loging);
                    Application.Run(new Main() { UserName = loging.UserName });
                }
                else
                {
                    Process current = Process.GetCurrentProcess();
                    foreach (Process process in Process.GetProcessesByName(current.ProcessName))
                    {
                        if (process.Id != current.Id)
                        {
                            MessageBox.Show("Another instance of eCS is already running.", "eCS already running", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            //SetForegroundWindow(process.MainWindowHandle);
                            break;
                        }
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这按预期工作 - 即使Login表单关闭(并且主应用程序表单已启动),它也不允许用户再次运行应用程序.我决定不Main从内部创建Login(这是我相信你的应用程序如何工作)而是我传递参数Main.我也做了一些小改动,Login所以它有UserName属性(相同Main).