Bootstrap

C# Winform程序启动监测的通用方案

使用 Process.GetProcessesByName 方法来检查当前程序是否已经启动,可以按照如下步骤进行:

  1. 首先,获取当前运行的进程名称。
  2. 使用 Process.GetProcessesByName 方法查找与当前进程名称相同的所有进程。
  3. 判断返回的进程数组长度,如果大于1,则表示当前程序已经有一个实例在运行。

以下是一个示例代码片段,展示了如何实现这一点:

 if (Comm.CheckCanStart()) //检查单实例
 {
     //工具库Log4Net和注册检查
     LogHelper.WorkAndInfo($"----------------------Header--------------------------");
     LogHelper.WorkAndInfo($"系统启动");
     
     //系统初始化,开启后台线程
     //。。。。。。

     //系统退出时,关闭后台线程
     //Project.Instance.Exit();

     LogHelper.WorkAndInfo("系统关闭");
     LogHelper.WorkAndInfo($"----------------------Footer--------------------------");
 }
 else
 {
     LogHelper.Info($@"当前检测到已经运行的{Process.GetCurrentProcess().ProcessName}
                         PID {Process.GetCurrentProcess().Id},显示已有进程!");
     Comm.ShowRunningInstance(Comm.GetExistedProcess());
 }

Comm类的几个方法,请参考如下代码:

  /// <summary>
  /// 检测单进程启动
  /// </summary>
  /// <returns>true:可以启动  false:已有启动进程</returns>
  public static bool CheckCanStart()
  {
      var currentProcess = Process.GetCurrentProcess();
      var process = Process.GetProcesses().AsParallel().FirstOrDefault(p =>
          p.ProcessName == currentProcess.ProcessName
          && p.Id != currentProcess.Id);
      return process == null;
  }


        /// <summary>
        /// 获取重复进程
        /// </summary>
        /// <returns>true:可以启动  false:已有启动进程</returns>
        public static Process GetExistedProcess()
        {
            var currentProcess = Process.GetCurrentProcess();
            var process = Process.GetProcesses().AsParallel().FirstOrDefault(p =>
                p.ProcessName == currentProcess.ProcessName
                && p.Id != currentProcess.Id);
            return process;
        }

;