让C#程序只运行一个实例,显示已经运行的界面

时间:2022-08-29 08:02:29

让程序只运行一个实例的方法一:

static void Main()

        {

            System.Threading.Mutex mutex;

            bool isNew;

            mutex = new System.Threading.Mutex(true, "myproject", out isNew);

            if (isNew)

            {

                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new Login());

            }

            else

            {

                MessageBox.Show("本程序已经在运行!","提示信息",MessageBoxButtons.OK,MessageBoxIcon.Warning);

            }

        }

 

让程序只运行一个实例的方法二(会显示正在运行的窗口):

static void Main()

        {

            Process instance = RunningInstance();

            if (instance == null)

            {

                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new Login());

            }

            else

            {

                HandleRunningInstance(instance);

            }

 

        }

 

//返回正在运行的程序进程

public static Process RunningInstance()

        {

            Process current = Process.GetCurrentProcess();

            Process[] processes = Process.GetProcessesByName(current.ProcessName);

            foreach (Process process in processes)

            {

                if (process.Id != current.Id)

                {

                    if (Assembly.GetExecutingAssembly().Location.Replace("/ ", "\\ ") == current.MainModule.FileName)

                    {

                        return process;

                    }

                }

            }

            return null;//第一次运行,返回null

        }

//显示正在运行的进程当前窗口

public static void HandleRunningInstance(Process instance)

        {

            ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); //置窗口为正常状态

            SetForegroundWindow(instance.MainWindowHandle);

        }

 

        #region调用系统api

        [DllImport("User32.dll ")]

        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

        [DllImport("User32.dll ")]

        private static extern bool SetForegroundWindow(IntPtr hWnd);

        private const int WS_SHOWNORMAL = 1;

        #endregion