主要通过修改program.cs文件的内容来实现。
首先在添加几个名空间的引用:
using System.Diagnostics; //使用Process
using System.Runtime.InteropServices; //使用DllImport
using System.Reflection; //使用Assembly
然后在引入系统API :
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
private const int WS_SHOWNORMAL = 1;
再添加几个成员函数:
public static Process GetPreIns()
{//获取当前进程句柄
Process cur= Process.GetCurrentProcess();
Process[] procs = Process.GetProcessesByName(current.ProcessName);
foreach (Process proc in procs )
{ //遍历,以获取前一实例的句柄
if (proc .Id != cur.Id) //忽略现有的例程
{
//确保例程从EXE文件运行
if (Assembly.GetExecutingAssembly().Location.Replace("/", "//") == cur.MainModule.FileName)
{
//返回另一个例程实例
return proc ;
}
}
}
//没有其它的例程,返回Null
return null;
}
public static void RestorePreIns(Process ins)
{//激活前一实例
ShowWindowAsync(ins.MainWindowHandle, WS_SHOWNORMAL); //确保窗口没有被最小化或最大化
SetForegroundWindow(ins.MainWindowHandle); //设置真实例程为foreground window
}
最后修改 Main函数
static void Main()
{
Process ins = GetPreIns();
if (ins == null)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyMainForm());
}
else
{
RestorePreIns(ins );//激活前一实例 }
}