如何防止表单再次打开。我制作了我的应用程序并安装了它,但是当我再次点击图标时,应用程序会再次打开,如果我再次点击图标,应用程序将继续打开,如何防止这种情况发生?
如何防止表单再次打开。我制作了我的应用程序并安装了它,但是当我再次点击图标时,应用程序会再次打开,如果我再次点击图标,应用程序将继续打开,如何防止这种情况发生?
Scott Hanselman之前写了一篇关于这个问题的好文章 - 这是链接
尝试使用Mutex。这是一篇关于此主题的好文章:
http://odetocode.com/Blogs/scott/archive/2004/08/20/401.aspx
[STAThread]
static void Main()
{
using(Mutex mutex = new Mutex(false, "Global\\" + appGuid))
{
if(!mutex.WaitOne(0, false))
{
MessageBox.Show("Instance already running");
return;
}
Application.Run(new Form1());
}
}
GC.Collection()
! - Jalal Said您可以通过检查当前运行的进程列表来实现。 如果是重复的,请自我终止。 这将防止多个实例。
Process[] pArry = Process.GetProcesses(); //Get Currently Running Processes
int Instance_Counter = 0; // To count No. of Instances
foreach (Process p in pArry)
{
string ProcessName = p.ProcessName;
//Match the Process Name with Current Process (i.e. Check Duplication )
//If So Kill self
if(ProcessName == Process.GetCurrentProcess().ProcessName)
{
Instance_Counter++;
}
}
if(Instance_Counter>1)
{
//Show Error and Kill Yourself
}
if
检查成功后立即终止第一个应用程序实例,因此最终你将没有任何应用程序实例在运行。 - Jalal Saidif (Instance_Counter>1)
后它可能会被关闭。 - Jalal Saidforeach
语句执行完毕并发现有一个正在运行的实例"Instance_Counter > 1
"之后,由于代码正在执行时已经发现运行的实例可能会被终止,因此用户试图运行新实例可能会失败! -->
- Jalal SaidMutex
将结束它。希望您现在明白了。 - Jalal Said这不是最好的方法,但是 Swanand Purankar 提到的固定方法:
//I set Timer's interval to "250", it's personal
//Just don't forget to enable the timer
private void timer1_Tick(object sender, EventArgs e)
{
var self = Process.GetCurrentProcess();
foreach (var proc in Process.GetProcessesByName(self.ProcessName))
{
if (proc.Id != self.Id)
{
proc.Kill();
}
}
}
但是使用这种方式,您无法设置错误。如果您想要设置错误:
private void Form1_Load(object sender, EventArgs e)
{
if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1)
{
MessageBox.Show("Hey there opening multiple instances of this process is restricted!", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Close();
}
}
然而,用户可以通过重命名程序轻松地绕过此问题。使用注册表可以帮助解决这个问题。但黑客/开发人员仍然可以通过使用进程监视器来摆脱这个问题。