封装类
提示:封装类必须与方法调用处为同一项目中及命名空间需要统一,否则导致判断程序进程不来自同一文件路径。
public class ProcessMonitor
{
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(System.IntPtr hWnd);
/// <summary>
/// 激活已存在实例
/// </summary>
/// <returns></returns>
public bool ActivateExistInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
foreach (Process process in processes)
{
if (process.Id != current.Id)
{
//保证要打开的进程同已经存在的进程来自同一文件路径
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
{
ShowWindowAsync(process.MainWindowHandle, 1); //调用api函数,正常显示窗口
SetForegroundWindow(process.MainWindowHandle); //将窗口放置最前端
return true;
}
}
}
return false;
}
}
方法调用
static class Program
{
[STAThread]
static void Main()
{
//如果已有实例则激活
if (new ProcessMonitor().ActivateExistInstance()) return;
//初始化
Application.Run(new frmMain());
}
}