参考
1 . C#对于mutex互斥量的深入理解 http://blog.csdn.net/xwdpepsi/article/details/6346890
2 . C#应用程序单例并激活程序的窗口 使其显示在最前端 http://www.cnblogs.com/daimage/archive/2012/06/21/2557472.html
3 . C# 关闭其他程序窗口、进程 http://www.cnblogs.com/hades/archive/2010/08/10/1796706.html
写了一个小的帮助类,自己试了试,还算能用,请指正。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
namespace SoweServerWatcher
{
static class SingleInstance
{
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
/// <summary>
/// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。
/// 系统给创建前台窗口的线程分配的权限稍高于其他线程。
/// </summary>
/// <param name="hWnd">将被激活并被调入前台的窗口句柄</param>
/// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零</returns>
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
private const int SW_SHOWNOMAL = 1;
private static void HandleRunningInstance(Process instance)
{
ShowWindowAsync(instance.MainWindowHandle, SW_SHOWNOMAL);//显示
SetForegroundWindow(instance.MainWindowHandle);//当到最前端
}
private static Process RuningInstance()
{
Process currentProcess = Process.GetCurrentProcess();
Process[] Processes = Process.GetProcessesByName(currentProcess.ProcessName);
foreach (Process process in Processes)
{
if (process.Id != currentProcess.Id)
{
return process;
}
}
return null;
}
public static bool IsSingle()
{
bool flag = false;
System.Threading.Mutex mutex = new System.Threading.Mutex(true, "SoweServerWatcher", out flag);
//第一个参数:true--给调用线程赋予互斥体的初始所属权
//第一个参数:互斥体的名称
//第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true
if (flag)
{
//MessageBox.Show("Running");
return true;
}
else
{
return false;
//MessageBox.Show("Another is Running");
//HandleRunningInstance(RuningInstance());
//System.Threading.Thread.Sleep(2000);//线程挂起2秒钟
//Environment.Exit(1);//退出程序
}
//Application.Run(new FormMain());
}
public static void ExitNewBring2FrontOld()
{
HandleRunningInstance(RuningInstance());
}
public static void ExitOld()
{
RuningInstance().Kill();
}
}
}
有一个bug,就是如果是以开机后无需登录自动运行的方式先启动了一个exe,应该是以SYSTEM用户启动,再登录后启动exe,就无法关闭旧程序,可能是SYSTEM和Administrator用户之间的MUTEX不同~~~~