一、借鉴:
/// <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 不重复启动程序
作者:꧁执笔小白꧂