我怎样才能防止表单再次打开?

本文关键字:表单 | 更新日期: 2023-09-27 18:06:27

如何防止表单再次打开?我制作了我的应用程序并安装了它,但是当我再次点击图标时,应用程序再次打开,如果我再次点击图标,我该如何防止呢?

我怎样才能防止表单再次打开?

Scott Hanselman在这方面做了一个很好的帖子-这里是链接

尝试互斥。这里有一篇关于这个主题的好文章:

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());
   }
}

您可以通过检查当前运行进程列表来实现。如果它是重复的,杀死自我。这将防止多个实例。

   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
    }

这不是最好的方法,而是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();
    }
}

仍然,用户可以通过重命名程序轻松地传递此值。使用注册表可以有所帮助。但黑客/开发人员仍然可以摆脱这一点。