我有一个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;
}
}
}
}
}
答案 0 :(得分: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;
}
}
}
}
}
}
}
按预期工作 - 即使关闭Login
表单(并且主应用程序表单已启动),它也不允许用户再次运行应用程序。
我决定不在Main
内创建Login
(我相信你的应用程序是如何工作的)而是我将参数传递给Main
。
我还对Login
进行了一些小改动,因此它具有UserName
属性(与Main
相同)。
答案 1 :(得分:0)
如果您对Microsoft.VisualBasic的引用没问题,则可以使用其SingleInstance处理。
[STAThread]
static void Main(string[] args)
{
using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, "MyApp.SingleInstance.Mutex", out createdNew))
{
MainForm = new MainDlg();
SingleInstanceApplication.Run(MainForm, StartupNextInstanceEventHandler);
}
}
public static void StartupNextInstanceEventHandler(object sender, StartupNextInstanceEventArgs e)
{
MainForm.Activate();
}
public class SingleInstanceApplication : WindowsFormsApplicationBase
{
private SingleInstanceApplication()
{
base.IsSingleInstance = true;
}
public static void Run(Form f, StartupNextInstanceEventHandler startupHandler)
{
SingleInstanceApplication app = new SingleInstanceApplication();
app.MainForm = f;
app.StartupNextInstance += startupHandler;
app.Run(Environment.GetCommandLineArgs());
}
}
答案 2 :(得分:-1)
如果您只想限制Form
的一个实例,可以执行以下操作:
public static class LoginForm
{
private static Form _loginForm = new Form();
public static bool ShowLoginForm(){
if(_loginForm.Visible)
return false;
_loginForm.Show();
return true;
}
}
因此,如果多于一个客户端将调用此方法,这只是显示登录表单的可能方法,如果它已经可见,则不会执行。
答案 3 :(得分:-2)
private bool IsSingleInstance()
{
string szCurrentProcessName = this.ProductName;
Process[] processlist = Process.GetProcesses();
foreach(Process theprocess in processlist)
{
string szProcessName = theprocess.MainModule.ModuleName.ToString();
if (szProcessName.Contains(szCurrentProcessName))
return false;
}
return true;
}