试过各种方法,下面这个相对比较好
在Program.cs中,添加如下,红色字部分要改掉
usingSystem.Diagnostics; //添加
namespace ProgramUnique
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Process p = Form1.GetRunningInstance();
if (p != null) //已经有应用程序副本执行
{
// MessageBox.Show("程序已经运行!");
Form1.HandleRunningInstance();
}
else //启动第一个应用程序
{
RunApplication();
}
}
static void RunApplication()
{
Application.EnableVisualStyles();
Application.Run(new Form1());
}
}
}
在Form1.cs中添加这个region即可
#region 程序唯一性
private const int WS_SHOWNORMAL = 1;
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd,int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtrhWnd);
public static Process GetRunningInstance()
{
Process currentProcess =Process.GetCurrentProcess();//获取当前进程
//获取当前运行程序完全限定名
stringcurrentFileName = currentProcess.MainModule.FileName;
//获取进程名为ProcessName的Process数组。
Process[] processes =Process.GetProcessesByName(currentProcess.ProcessName);
//遍历有相同进程名称正在运行的进程
foreach(Process process in processes)
{
if(process.MainModule.FileName == currentFileName)
{
if (process.Id!= currentProcess.Id)//根据进程ID排除当前进程
return process;//返回已运行的进程实例
}
}
return null;
}
public static bool HandleRunningInstance(Process instance)
{
//确保窗口没有被最小化或最大化
ShowWindowAsync(instance.MainWindowHandle,WS_SHOWNORMAL);
//设置真实例程为foreground window
returnSetForegroundWindow(instance.MainWindowHandle);
}
public static bool HandleRunningInstance()
{
Process p = GetRunningInstance();
if (p != null)
{
HandleRunningInstance(p);
return true;
}
return false;
}
#endregion