一、借鉴:

/// <summary>
/// 检测进程,只能启动一个
/// </summary>
static void CheckProcess()
{
    Process currentProcess = Process.GetCurrentProcess();
    foreach (Process item in Process.GetProcessesByName(currentProcess.ProcessName))
    {    
        if (item.Id != currentProcess.Id &&
        (item.StartTime - currentProcess.StartTime).TotalMilliseconds <= 0)
        {
            item.Kill();
            item.WaitForExit();
            break;
        }
    }
}

二、实现:

  检查进程是否已经启动,已经启动则显示已打开的程序并退出当前程序,未打开则继续运行。

#region main函数里
            string strProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;  // 获取欲启动进程名
            if (System.Diagnostics.Process.GetProcessesByName(strProcessName).Length > 1)
            {
                RaiseOtherProcess();
                Application.Current.Shutdown();  // 结束UI进程-WPF
                // Application.ExitThread();  // 结束UI进程-WinForm
                System.Environment.Exit(0);      // 结束全部进程
                return;
            }  // 检查进程是否已经启动,已经启动则显示已打开的程序并退出当前程序。 
        #endregion main函数里

        #region 不重复启动程序
        [DllImport("user32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);  // 窗口展示到最前面
        [DllImport("user32.dll")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);  // 设置窗口的显示状态,9为还原型形态 5显示窗体 4最大化
        [DllImport("user32.dll")]
        private static extern bool IsIconic(IntPtr hWnd);  // 检查窗口是否为最小化状态
        /// <summary>
        /// 激活已打开窗口
        /// </summary>
        public static void RaiseOtherProcess()
        {
            Process proc = Process.GetCurrentProcess();
            foreach (Process otherProc in
                Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName))
            {
                if (proc.Id != otherProc.Id)
                {
                    IntPtr hWnd = otherProc.MainWindowHandle;
                    if (IsIconic(hWnd))  // 检查窗口是否为最小化的状态
                    {
                        ShowWindowAsync(hWnd, 9);  // 还原下窗口
                    }
                    SetForegroundWindow(hWnd);  // 展示到前台
                    break;
                }
            }
        }
        #endregion 不重复启动程序

 

作者:꧁执笔小白꧂