PS: Mutex 必须是静态的,这样才能跨进程
另外mutex的实例名,一般用进程名,这样其实也不是太好,我的解决方法是取GUID
Attribute guid_attr = Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(), typeof(GuidAttribute));
string guid = ((GuidAttribute)guid_attr).Value;
这样应该就比较完美了原贴:http://blog.youkuaiyun.com/billcat/article/details/5317199
代码简洁实用,自己看吧。
需要强调的一点就是注意要先声明一个静态的字段Mutex。
(网上这样比较多,贴出来主要目的是自己学习留存,大虾们绕道吧...)
static System.Threading.Mutex mutex; //这个静态类型的Mutex是必需的
[STAThread]
static void Main()
{
bool IsFirstRun;
string mutexName = "Tray";//Application.ProductName;
mutex = new System.Threading.Mutex(true, mutexName, out IsFirstRun);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (IsFirstRun)
{
Application.Run(new MainForm());
GC.SuppressFinalize(mutex);
}
else
{
MessageBox.Show("该程序已经启动!");
}
}
有些程序员需要在第二次打开软件的时候,将已打开的第一个实例进程激活为前置程序,上面代码就做不到了,
这时需要在IsFirstRun==false的时候索引当前所有Process找出该实例进程,将其激活就行了。