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)
我做了一些小改动:
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
).