本文是通过互斥锁以及windows api 来实现只运行一个实例程序,如果已经在运行,再次打开程序,会将以运行的程序置顶显示。
完整代码如下:
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(IntPtr hwnd);
private static Process GetRunningInstance()
{
Process pCurrent = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(pCurrent.ProcessName);
foreach (Process p in processes)
{
if (p.Id != pCurrent.Id)
{
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == pCurrent.MainModule.FileName)
{
return p;
}
}
}
return null;
}
private static void HandleRunningInstance(Process instance)
{
ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
SetForegroundWindow(instance.MainWindowHandle);
}
private static System.Threading.Mutex mutex;
protected override void OnStartup(StartupEventArgs e)
{
Process instance = GetRunningInstance();
mutex = new Mutex(true, "TestApp", out bool ret);
if (ret)
{
base.OnStartup(e);
}
else
{
HandleRunningInstance(instance);
Environment.Exit(0);
}