How can I prevent launching my app multiple times?

后端 未结 10 1833
北荒
北荒 2020-12-13 18:42

I deployed my C# WinForms application using ClickOnce installation. Everything works fine with it (after a lot of work) :), but now I\'m facing a problem:

Whenever

相关标签:
10条回答
  • 2020-12-13 18:57

    At program startup check if same process is already running:

    using System.Diagnostics;
    
    static void Main(string[] args)
    {
       String thisprocessname = Process.GetCurrentProcess().ProcessName;
    
       if (Process.GetProcesses().Count(p => p.ProcessName == thisprocessname) > 1)
          return;           
    }
    
    0 讨论(0)
  • 2020-12-13 18:58

    solution in Windows form application Prohibit again run application(reopen application).

    1- first add Class RunAlready.cs

    2-Call method processIsRunning() with Name Process from RunAlready.cs in Program.cs

    Program.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace Tirage.MainStand
    {
    static class Program
    {
    
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            PublicClass.Class.RunAlready RunAPP = new PublicClass.Class.RunAlready();
            string outApp = RunAPP.processIsRunning("Tirage.MainStand");
    
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            MainStand_FrmLogin fLogin = new MainStand_FrmLogin();
            if (outApp.Length == 0)
            {
    
                if (fLogin.ShowDialog() == DialogResult.OK)
                {
                    Application.Run(new MainStand_masterFrm());
    
                }
            }
            else MessageBox.Show( "Instance already running");
    
          }
        }
     }
    

    class RunAlready:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace PublicClass.Class
    {
      public  class RunAlready
        {
          public  string processIsRunning(string process)
            {
            string xdescription = "";
            System.Diagnostics.Process[] processes =
                System.Diagnostics.Process.GetProcessesByName(process);
            foreach (System.Diagnostics.Process proc in processes)
            {
                var iffffd = System.Diagnostics.Process.GetCurrentProcess().Id;
                if (proc.Id != System.Diagnostics.Process.GetCurrentProcess().Id)
                {
                    xdescription = "Application Run At time:" + proc.StartTime.ToString() + System.Environment.NewLine;
                    xdescription += "Current physical memory : " + proc.WorkingSet64.ToString() + System.Environment.NewLine;
                    xdescription += "Total processor time : " + proc.TotalProcessorTime.ToString() + System.Environment.NewLine;
                    xdescription += "Virtual memory size : " +         proc.VirtualMemorySize64.ToString() + System.Environment.NewLine;
                }
            }
    
    
            return xdescription;
        }
    }
    }
    
    0 讨论(0)
  • 2020-12-13 18:59

    When starting you application, main always calls Application.Run(). Look in your STAThread-Main method and before Application.Run test, if there are running instances of your .exe.

    Process p = Process.GetProcesses();
    //check for your .exe
    

    See this post here.

    0 讨论(0)
  • 2020-12-13 19:01

    Use this code:

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

    from The Misunderstood Mutex

    0 讨论(0)
  • 2020-12-13 19:04

    There are times **Mutex** is not working in some areas. Like using in console application. So I tried using WMI Query.

    Try this and it will work.

            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                if (!isStillRunning())
                {
                   Application.Run(new Form1());
                 }
                 else {
                     MessageBox.Show("Previous process still running.",
                        "Application Halted", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                     Application.Exit();
                 }      
            }
    
            //***Uses WMI Query
            static bool isStillRunning() {
                string processName = Process.GetCurrentProcess().MainModule.ModuleName;
                ManagementObjectSearcher mos = new ManagementObjectSearcher();
                mos.Query.QueryString = @"SELECT * FROM Win32_Process WHERE Name = '" + processName + @"'";
                if (mos.Get().Count > 1)
                {
                   return true;
                }
                else
                   return false;
            }
    

    Hope it helps.

    0 讨论(0)
  • 2020-12-13 19:05

    Using Mutex is the way to go because guessing process names is full of flaws and niggles. Check out this really nice illustration

    0 讨论(0)
提交回复
热议问题