C# Mutex判定进程是否启动

发布时间 2023-08-30 17:27:07作者: 马什么梅

System.Threading.Mutex mutex;//注意,此变量要定义为成员变量,而不是局部变量

  bool CheckMultiInstance()
        {
            bool createdNew = true;

            mutex = new System.Threading.Mutex(true, "_TEST_Mutex_", out createdNew);//这种在系统多用户下,每个用户能启动一个程序进程。

mutex = new System.Threading.Mutex(true, "Global\\_TEST_Mutex_", out createdNew);//这种在系统中,不管几个用户,只能存在一个这样的程序进程


            if (!createdNew)
            {
               MessageBox.Show("Program is already running.");
            }
            return createdNew;
        }


        /// <summary>
        /// Is exist same process
        /// </summary>
        /// <returns></returns>
        public static Process GetExistProcess()
        {
            try
            {
                var current = Process.GetCurrentProcess();
                var pArrayy = System.Diagnostics.Process.GetProcessesByName(current.ProcessName);

                if (pArrayy == null || pArrayy.Length == 0)
                {
                    return null;
                }
                foreach (var item in pArrayy)
                {
                    try
                    {

                       /**** 这种判断方法,有BUG,当第一次以管理员启动,第二次不以管理员启动时,将会有访问被拒绝的异常抛出

                        if (!item.ProcessName.ToUpper().Contains(current.ProcessNameToUpper()))
                        {
                            continue;
                        }
                        if (item.Id != current.Id && item.MainModule.ModuleName.ToUpper() == current.MainModule.ModuleName.ToUpper())
                        {
                            return item;
                        }  

                       **** */    

                       ///改成一下方法可解决权限问题

                          if(item.MainWindowHandle!=Intptr.Zero)///此时已存在的进程主窗口句柄是有值的,而第二次的APP虽然起来了,但是窗口还没有Show出来,是没有主窗口句柄的

                          {

                              return   item;

                           }
                    }

                    catch (Exception er)
                    {
                        LogHelper.WriteException(er);
                        continue;
                    }
                
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteException(ex);
            }
            return null;

        }

 

补充以管理员权限启动:

 

 

   privatevoidToShowExeAsAdmin()

        {

      try

            {

        stringstartPath="test.exe";

        if (File.Exists(startPath))

                {

                    ProcessStartInfostartInfo=newProcessStartInfo();

 

                    startInfo.FileName=startPath;

 

                    startInfo.UseShellExecute=true;

 

                    startInfo.Verb="runas";// 用admin权限启动新进程 

 

                    System.Diagnostics.Process.Start(startInfo);//use admin

               }

            }

      catch (Exceptionex)

            {

                LogHelper.WriteException(ex);

            }

        }