两种方法实现效果:方法一是提示程序重复运行(简单,比较轻量);方法二是弹出已经打开的程序窗口来实现(人性化,复杂);
方法一:主要是对程序主进程的控制,在程序入口代码处创建一个互斥体,使得主程序只能存在一个,主要是在 Program.cs 中来实现,默认Program.cs代码如下:
static class Program
{
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
public static Process RunningInstance()
{
throw new NotImplementedException();
}
}
修改后代码如下:
static class Program
{
/// <summary>
/// 应用程序的主入口点,程序同时只能运行一个
/// </summary>
[STAThread]
static void Main()
{
bool createNew;
using (Mutex m = new Mutex(true, Application.ProductName, out createNew))
{
if (createNew)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Main()); //其中 Main为窗体ID,默认是 Form1
}
else
{
MessageBox.Show("程序已运行,请勿重复运行!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
}
}
方法二:命名空间引用
using System.Reflection;
using System.Diagnostics;
using System.Runtime.InteropServices;
代码如下(可直接拷贝使用 注意修改主窗体ID名):
static class Program
{
/// <summary>
/// 应用程序的主入口点,程序同时只能运行一个
/// </summary>
[STAThread]
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetWindow(IntPtr hWnd);
private const int SW_SHOW = 1;
static void Main()
{
Process process = RunningProcessInstance(); if (process != null)
{
HandleRunningInstance(process);
System.Environment.Exit(1);
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Main()); //这里默认是主界面的Form1
}
private static void HandleRunningInstance(Process instance)
{
ShowWindowAsync(instance.MainWindowHandle, SW_SHOW);
SetWindow(instance.MainWindowHandle); //运行的程序显示到最前端
}
public static Process RunningProcessInstance()
{
Process currentProcess = Process.GetCurrentProcess();
Process[] Processes = Process.GetProcessesByName(currentProcess.ProcessName);
foreach (Process process in Processes)
{
if (process.Id != currentProcess.Id)
{
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == currentProcess.MainModule.FileName)
{
return process;
}
}
}
return null;
throw new NotImplementedException();
}
}
}